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.
When I initially threw together the primitive stuff it was pretty hacky. Can we handle these better, ie. have a set or enum of sorts? That way we don't have to make this awkward check or the check below (which seems to only care about boolean?) for every primitive now and in the future.

Nothing blocking this merge, just something to think about. I'll pick it up after this merges.