Rework to support a PUT/GET io model

The overall goal here is to make the interface cleaner externally as well as
internally.  Notably this:

* Separates the serialization role from the controller role.  Previously they
were mixed a bit because it seemed like some parts of the format belonged to
each (and could therefore be parsed more flexibly/speedily).  As usual though
it got kinda knarly.  Format is format and the serializer is responsible for
it.  During testing I've settled on an easy-to-read, multi-line content format
that is only suitable if the output remains together, as it will during
development.

* Shifts around some of the initialization logic.  The work on this front is
really a patch and highly imperfect.

* Reorganizes the class structure.  I think I got it better than before.