Refactored async reads, MemoryStream, Clean up

Async reads now wait for data to be available, then fill in the provided
buffer once EndRead is called. Only thing that bothers me is the
background thread that spins checking for new data. Will try and
refactor to be more efficient.

MemoryStream now behaves much more like the C# MemoryStream in terms of
reading and writing.

StreamOperationRunnable converted to an interface.
StreamOperationResult now implements IStreamOperationRunnable instead of
depending on a separate StreamOperationRunnable class.