Is this contract good enough? Or we want to extract some of these into a an abstract base encoder class?

My biggest want here is that it'd be compatible with the old Encoder (i.e. a subset of the original methods) so the thing I extract would plug in seamlessly.

I also thought about making `Encoder#jsonify` public (or re-use `Encoder#as_json` name), but that doesn't really work because it might expose internal encoder objects (`EscapedString`s, etc).

This is a potential consumer of of this contract: https://gist.github.com/chancancode/f52f2c3d6148986348af (this is what I actually wanted to build in the first place that caused me to embark on this JSON journey :P). As you can see, it needs to copy a lot of code from the current implementation.

Not ideal, but then making this API perfect is not really my priority right now. I don't see a lot of people writing custom encoders, and I can probably live with mirror Rails code. If a pattern emerges it's easily enough to fix the API in the future?