Make JsonArray/JsonObject opaque types.

Hid the actual representations of arrays/objects behind opaque types,
so now the module does not need to commit to one. Removed the #ifdefs
because array/list performance were so close together as to not matter,
and the arrays are hidden now anyway so they are no longer mutable.

Also renamed/refactored several of the extraction/construction functions
to have much more consistent and intuitive names.

Oh, and overrode ToString. This required sadly stuffing the
serialization code up with the type definitions, but alas.