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).
The error messages were fixed in a different branch (which is now in `master`). These errors are placeholders and they are going to be removed one by one as we implement the functionality to perform compilation.

(But honestly, most of `ExpressionGraph` is a big hack right now, so I know where you're coming from. Hopefully I have enough time this month to implement something better, that properly separates building the graph from compiling it. A lot of this will need to change anyway when I correctly implement library-defined schematic primitives, since we're assuming a LOT right now about the structure of the circuit, and this is incorrect for more general schematics.)