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
Agreed that the naming here is a bit strange.

At one point I passed in a Map but I felt it was cleaner to pass in the object that built the map.

Another thing that might make the naming clearer could be to rename ScopeBuilderBase to ScopeVisitor?