Merge late-night client code

Experimenting with the ISerializable class at the moment, which is a templated ABC with some interesting implications (other abstract classes that inherit from ISerializable aren't forced to re-specify the ISerializable functions, but concrete classes will need to implement both the ISerializable functions and any in their ABC)

Note that in this pull request's only commit is a rather pointless re-specification of the ISerializable functions in the ICityMap class.  This can safely be removed by future commits, it's just late and I'm tired.