Change buffer to behave like a stream

This branch changes the buffer to act more like a stream.

It wraps an object that responds to `#<<`, and uses a proxy object to represent indentation, rather than mutating the object each time it is indented/outdented.

One benefit to this approach is that the output object does not have to be a String. It can be an IO handle, an Array or anything else that responds to `#<<`.