Yet another JSON serializer; this exists to avoid external dependencies.
Strings, numbers, booleans, and null are transformed as expected. Maps become
nested objects; arrays and collections (list, set, whatever) become arrays.
Dates are stringified as ISO-8601 timestamps. Anything else is stringified
using its toString() method.