codecvt: Re-implement do_out and do_unshift
The previous implementation assumed that only one byte would be given
in the from
buffer by the caller at a time. This may be true for
MSVC but is not for the GNU library on Windows. Re-implement these
methods to handle more than one byte per call.
Also simplify the state management by keeping all state between calls
directly in the mbstate_t
argument instead of using it to index our
own heap-allocated state.
Fixes: #16893 (closed)