Made Async reads more effecient

Instead of looping until bytes become available, I now read one byte (or
fail whichever comes first) and then fire the EndRead method.