ERB renders to an output buffer (#346)

Instead of appending content to a simple array, ERB now appends content
to a custom object, an OutputBuffer. This allows more control over how
the content is then collected and joined ready for output. Internally,
an output buffer is just an array which is appended content to, and
simple join() once finished.