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
Add a `codecvt` class that can be used as facet for locale so that it's
possible to convert from internal UTF-8 encoding to other encodings such
as Windows ANSI codepage.