Refactor scopes and allow `js` to use variables from the current scope

* There is now a Scope class that encapsulates all scope functionality
* A `js` form can use variables from the current scope like this:
  // Evaluates to `20`
  ['let',
   [['x', 10]],
   [['js', function(y) {return this.get('x') * y;}], 2]]