Implement symbol table

This ended up being easier than I thought (or at least that's what I'm hoping)

Fixes #79
Okay, I misunderstood the requirements. The original design was that `Node`s, `Connection`s, and `Constraint`s occupied different namespaces in the intermediate representation. If they are the same namespace, then these three can be combined into one symbol table like `Map<String, Value>` (but distinct from an `AttributeSet`). This will mean adding a type-check whenever something is pulled out of the symbol table.