'Load & cache the given blocks from the course. May return the blocks in any order.
Load the definitions into each block if lazy is in kwargs and is False;
otherwise, do not load the definitions - they\'ll be loaded later when needed.'

@contract(course_entry=CourseEnvelope, block_keys='list(BlockKey)', depth='int    |    None')
def _load_items(self, course_entry, block_keys, depth=0, **kwargs):

    lazy = kwargs.pop('lazy', True)
    should_cache_items = (not lazy)
    runtime = self._get_cache(course_entry.structure['_id'])
    if (runtime is None):
        runtime = self.create_runtime(course_entry, lazy)
        self._add_cache(course_entry.structure['_id'], runtime)
        should_cache_items = True
    if should_cache_items:
        self.cache_items(runtime, block_keys, course_entry.course_key, depth, lazy)
    with self.bulk_operations(course_entry.course_key, emit_signals=False):
        return [runtime.load_item(block_key, course_entry, **kwargs) for block_key in block_keys]
