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).
Right, so `UnknownTypeValue` is the default type of everything that
* doesn't know its own type, and
* hasn't been assigned a type by the static type-checker yet.

The dynamic type-checker will look for anything that has this type and try to give it a "better" type by evaluating expressions.