fix: correct mention rendering with multi-byte UTF-8 characters
The AT Protocol uses UTF-8 byte indices for facets, but JavaScript's
String.slice() operates on UTF-16 code units. This caused mentions to
shift when multi-byte characters (emojis, accented chars) appeared
before them.
Now using TextEncoder/TextDecoder to properly handle byte-level
slicing for accurate facet positioning.