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.
Do we need the super-fine exception message throwing? A bunch of indentations are scary and kind of awkward looking. Would it be suffice to just let the JSONObject throw for the missing field and do a catch(Exception)?