Fixes to StreamExts.

Separated out from #5503 and built upon.

Fixes #2441, Fixes #4135, Fixes #4357, Fixes #5520, maybe others.

Lots of code was using Stream.Read without checking the return result. This is a fatal error as Stream.Read is allowed to return less than the requested data. If you don't check the return result your array will only be partially filled and bad things happen.

ReadBytes was broken and would throw an EndOfStreamException if the count was anything less than the requested number. If the count was non-zero then this is a bogus exception and results in traces like #5520.

ReadAllBytes was broken and wouldn't even do you the good graces of throwing an exception. Instead it'd hand you back a partially filled array and let you choke later on all the zeros at the end of the array you weren't expecting. PrepareMap called this method so you would get traces like in #2441, #4135, #4357.

Personally I didn't know file streams did this (I never checked but I assumed this was something more intended for network streams and stuff) but today I learned that they do. This explains why it only occurred occasionally - most of the time you would actually get all the bytes you requested.