Move buffer offset handling into idris code

This simplifies the native code significantly, including removing GETTYs
at every Buffer-related function call, at the cost of:

* Needing to store an offset of 0 in cases where the old code could just
  refer directly to the struct Buffer
* Boxing of the offset
* When an append to a buffer requires an allocation + copy, all of the
  data before the offset needs to be allocated and copied too (as
  there doesn't seem to be a good way for the append functions to tell
  the idris code when the offset needs to be changed and when not)

I think the simplification outweighs the cost, but I don't have hard
numbers so YMMV.