Scopebuilding

I think this does everything it needs to do, but let me know if I overlooked something.
Hmmmmmmmmmmm... I can see two better solutions to this problem

 1. Change the API of `Scope` to accept a concrete `TypeValue` instead of an expression
 2. Change the API of `Scope` so that it doesn't need to know a variable's type
 2. Require all variable assignments to include a statically defined type 
 3. (Keep this as is)

Do with this list what you will. We can open an issue to implement one of these l8ter.