Static typechecking for simple variables and functions

Fixes #18 (variable creation and definition no longer requires a type expression)

This is a starting point for a number of more complex features (e.g. user-defined functions, user-defined/library-defined primitives).
This whole class is really confusing and full of "code smells" in my opinion. 
Why do we have an  `UnknownTypeValue` class if it just causes errors to the be thrown? 
What am I going to do as a developer if I get an error message that just says "illegal value"?