Support reading and writing Buffers in-place.

Optionally allow the caller to provide an existing Buffer and offset
to toString() and toBuffer().  If these arguments are left off, then
act as the API did previously either creating the Buffer in toBuffer()
or assuming an offset of zero in toString().

The goal of these changes is to reduce object creation by avoiding
unnecessary slice() calls.

Tests included.