This functionality allows us to read data out of a buffer without
irrevocably consuming it. We read what we can, and when we're done we
throw the reader away.
The plan is to read as much of a stream of data as is available, and if
we can't read a complete message, we simply toss the reader away and
try again when we get more data. I think that perhaps this strategy
might be easier than coming up with a state machine to parse the stream.
Please do not advance the underlying buffer while trying to use a
reader.