switch to a more compact representation of closure environments.

Before this patch normal JS objects were used for closure environments, but this
has a number of downsides:

1) environments are larger than they need to be allocation-wise by a few pointers, and
   access to properties requires extra indirections.

2) loads and stores of closed-over values get compiled to _ejs_object_getprop/setprop calls,
   just like normal property accesses.

   This is pretty terrible perf-wise, since we're doing property lookups when we should/could
   know exactly the slot to store the value at compile time.  Also, getting or setting a property
   can throw exceptions in JS, so when accesses to closed over values happens in a try block,
   we end up generating a *lot* more basic blocks to deal with things.

After this patch environments only pay for the GCObjectHeader structure and a 32 bit length field.
Fields are allocated inline, and before codegen occurs the name of the field is completely compiled
away in favor of slot numbers.  So something that once looked like this post code-transforms:

  let %env_0 = {}
  env_0.closed_over = [1,2,3];

now looks like:

  let %env_0 = %makeClosureEnv(1);
  %slot(%env_0, 0) = [1,2,3];

with the compiler doing nice things with the %makeClosureEnv/%slot builtins.