             "#{ms} ms"
 
         renderable = immediate_renderable_list_builder $item
-        run_context.add_renderable renderable
-        nested_context = run_context.create_nested_context
+        @add_renderable renderable
+        nested_context = @create_nested_context
           renderable_list_builder: renderable
 
-        promise = run_context.in_context nested_context, fn
+        promise = nested_context.apply_to fn
         promise.then ->
           $item.attr 'data-async-status', "loaded in #{duration()}"
         promise.fail ->
           $item.attr 'data-async-status', "failed in #{duration()}"
         promise
 
-    run_context.fns = bind_context_fns run_context, run_context.imported_context_fns
-    fns_and_vars = bind_context_fns run_context, run_context.context_fns
-    _.each run_context.vars, (vars, name) -> _.extend (fns_and_vars[name] ?= {}), vars
-    _.extend fns_and_vars, fns_and_vars.builtins
-    _.each fns_and_vars, (mod, name) ->
-      if run_context[name]?
-        console.warn mod._lead_context_name, 'would overwrite core'
-      else
-        run_context[name] = mod
-    run_context.current_context = run_context
-
-    run_context
+    scope_context = {}
+    run_context_prototype.fns = bind_context_fns scope_context, run_context_prototype.imported_context_fns
+
+    create_new_run_context = (parent) ->
+      new_context = Object.create parent
+
+      fns_and_vars = bind_context_fns new_context, new_context.context_fns
+      _.each new_context.vars, (vars, name) -> _.extend (fns_and_vars[name] ?= {}), vars
+      _.extend fns_and_vars, fns_and_vars.builtins
+      _.each fns_and_vars, (mod, name) ->
+        if run_context_prototype[name]?
+          console.warn mod._lead_context_name, 'would overwrite core'
+        else
+          new_context[name] = mod
+      new_context.current_context = new_context
+      new_context
+    run_context = scope_context.current_context = create_new_run_context run_context_prototype
 
   scope = (run_context) ->
     _.extend {}, run_context.fns, run_context.imported_vars


      display_object: (object) ->
        for handler in result_handlers
          return if handler.call run_context, object

      value: (value) -> _lead_context_fn_value: value


  bind_context_fns = (run_context, fns, name_prefix='') ->
    bind_fn = (name, op) ->
      bound = (args...) ->
        if @imported_context_fns? and @ != run_context.current_context
          # it looks like this is a context, but not the current one
          console.warn 'mismatched run context'
          console.trace()
        # if the function returned a value, unwrap it. otherwise, ignore it
        op.fn.apply(run_context.current_context, args)?._lead_context_fn_value ? ignore
      bound._lead_context_fn = op
      bound._lead_context_name = name
      bound
