Switched away from using unsafe System.Text.Decoder methods that take pointers

They are surprisingly less efficient than the managed array variants because
pointer variants allocate temporary internal byte and char arrays and then
just calls the overload that takes arrays, anyway.

Plus Mono has a bug in its GetBytes(byte*, int, int, char*, int)
implementation.