Serialization and deserialization of User-Defined Types with type aliases

This uses a new class called `UserDefinedTypeValue` to get around the "ambiguous type problem".  Fixes #32. Hypothetically related to #7.
The problem is that the JSONObject *doesn't* throw for a missing field; it returns `null`. Then we get a cryptic `NullPointerException` turning up. We kind of have to do the check ourselves if we want to know what went wrong beyond "something wasn't there when it should have been".