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
Name as argument and result is confusing. How about
`* Converts an identifier expression or token to a string.`
or `getVariableNameAsString` or `variableNameToString`