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 one additional thing it gives us is a unique object for each user-defined type (which is the `UserDefinedTypeValue` itself). Other than that, there's nothing more to this.