Serialization and deserialization of schematics

Includes all these features and more:

* Handles constraints
* Serializes nodes and connections correctly (by specifying their typename)
* Handles derived intermediate types through a depth-first search algorithm (deserialization never sees a derived type before its base type).
Trailing space!

Aside: In Eclipse/Intellij (if you're using one of those) there's a cool "Save Action" feature that removes all trailing whitespace on save.