Force StreamSlice to throw on too-short reads.

This restricts StreamSlice to *always* require a size (which makes sense for
our use case, though I may want to refactor for others); once that's done,
it's easy to recognize the case of "you told me there'd be XXX bytes, but i'm
out of bytes and i've only read YYY < XXX". I throw in that case.

Did some hacky additions around exception conversions; I'll clean that up in a
later CL.