buffer: start on read buffering.

this allows us to buffer to/from the stream implementations. this should
reduce the number of read syscalls we perform since they are amortized by
filling the entire buffer.

the buffer is grown in powers of two.