New custom stream classes replacing BufferedStream and MemoryStream

Hi all,

Per discussion with @roji, I implemented some Stream classes to replace BufferedStream and MemoryStream, and got them working in Npgsql.

This is really preliminary work, and just the start of a much bigger project that I don't have time to finish, but i think it provides part of the basis needed for Npgsql to really take control of its buffer management.

i did not implement a buffer pool, which may prove to be another important aspect of this project, but a buffer pool is really quite trivial to write, and adapting NpgsqlMemoryStream to it would also be trivial.

The hard, tedious work ahead will lie in refactoring Npgsql to extend and use these new streams to eliminate a lot more allocations and copy operations, partly by taking advantage of the fact that we can have full access to their buffers.

-Glen

> No. readBufferCapacity is the number of bytes we have been able to read into the buffer, which is <= BufferSize.

> Coming back to this after some time away, the terminology seems less than obvious. Never a good sign. I may need to rethink a few things in the interest of readability over maximum code re-use.

Isn't this the invariant?:
readBufferPosition contains the number of bytes from the start of the buffer that has already been read.
readBufferCapacity minus readBufferPosition contains the number of buffered bytes in the read buffer, that are ready to read, starting at position readBufferPosition.

If so, we have BufferSize - readBufferCapacity more bytes space available in the buffer that can be filled. Then, we should fill that space with count - (readBufferCapacity - readBufferPosition) bytes that we read from the Stream, if readBufferPosition + count <= BufferSize.