The Json type represents valid json syntax. It cannot be directly
analyzed, however it can be rendered into a ByteString and used to
as a component of an array or an object to build a bigger json value.

The Array type represents syntax for a json array. It has been given
a singleton constructor element and an instance of Monoid, so that
mempty represents the empty array and mappend concatinates two arrays.
Arbitrary arrays can be constructed using these operators.

The Object type represents syntax for a json object. It has a singleton
constructor row, and an instance of Monoid, so that mempty represents the
empty object and mappend concatinates two objects. Arbitrary objects can
be constructed using these operators.

Note that duplicate field names will appear in the output, so it is up
to the user of this interface to avoid duplicate field names.

The Escaped type represents json string syntax. The purpose of this
type is so that json strings can be efficiently constructed from multiple
Haskell strings without superfluous conversions or concatinations.

Internally, it is just a Builder value which must produce a UTF-8 encoded
bytestring with backslashes, quotes, and control characters appropriately
escaped. It also must not render the opening or closing quote, which
are instead rendered by toJson.

Some types can be viewed as a monoid in more than one way,
e.g. both addition and multiplication on numbers.
In such cases we often define newtypes and make those instances
of Monoid, e.g. Sum and Product.

Fold a list using the monoid.
For most types, the default definition for mconcat will be
used, but the function is included in the class definition so
that an optimized version can be provided for specific types.

Lift a semigroup into Maybe forming a Monoid according to
http://en.wikipedia.org/wiki/Monoid: "Any semigroup S may be
turned into a monoid simply by adjoining an element e not in S
and defining e*e = e and e*s = s = s*e for all s S." Since
there is no "Semigroup" typeclass providing just mappend, we
use Monoid instead.