read_string accepts invalid UTF-8 (e.g., invalid continuation bytes, overlong sequences, surrogate range, or > U+10FFFF) and feeds them to unsafe_to_char.
Suggested fix: validate UTF-8 properly and raise InvalidString on malformed sequences. Mirror in async paths.
Refs: lib/reader.mbt, lib/async_reader.mbt.