Don't use abstract in interfaces.
Handle multiple representations of a response.

This allows for requests with the Accept-Encoding header. Compressed
representations are generated on first use, then retained for later
reuse.
Centralise encodings a little.
Set content length from representation.

Resolves #6.