Move JSON encoding into hyperdns-hal renderer

Previously when encoding an object into a JSON string, we would first
call the _hal() method of the object, which would produce a Python
dictionary containing all the properties, embedded resources, and links,
in a form ready for serialisation. The subsequent encoding of that
dictionary into a JSON string would then occur outside of the module -
specifically in hyperdns-flask's result.py, using EnhancedJSONEncoder.

With this commit, the JSON encoding step has now been moved into
hyperdns-hal's render.py module. Thus, libraries which use hyperdns-hal
no longer need to concern themselves with the JSON encoding step, at
least in the case of calling _hal() on an object, since that now returns
a string.

Internally within render.py, the two steps are still performed as
before, but what used to be called _hal() is now _hal_raw(). This allows
the recursion through the object tree to still be performed without the
need for string concatenation; the resulting dictionary is simply
converted to a JSON string all in one go at the end.

As part of this change, the EnhancedJSONEncoder class has now been moved
into render.py. It is still used for other purposes in result.py, and is
thus imported there.