Better no syntax rule message

The existing exception wasn't caught in the REPL and had an unusably
verbose message
Rework how scopes and hygiene are handled

- Mutate scopes in-place instead of creating new scopes and passing them
  upward. This is much less functional but it results in clearer code
  and more closely models the semantics of Scheme

- Remove the privileged "evalScope" instead evaluate every symbol purely
  based on its scope

- Don't create a single new scope when defining a lambda. Instead create
  a new scope for each scope found in the body. In each new scope inject
  only the arguments that were defined in the matching parent scope.
  This allows proper hygiene for arguments created in macro expansions.