Const checker

This refactors how we build the scopes and then implements a check that validates that we are not mutating const bindings.

Fixes #18
funciton -> function

How about:
These are variable declarations introduced in this scope. Because var is not scoped in blocks
we also add them to parent scopes, recursing until we find a function or the top level scope.