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).
We can just call contains() here.