Shuffle bytes reads over to DecodeStream too.

This means we won't get out of sync if doing mixed string/bytes reads,
but additionally lets us remove another place we directly call libuv
to read data.