Implement annot-preserving replace for annot strs
Implement `replace` function for `AnnotatedString` that properly handles
annotation regions during pattern replacement operations. The function
tracks which bytes are replaced versus preserved, maintaining annotations
only on original content and adding new annotations from replacement text.
- Supports AnnotatedChar, AnnotatedString, and SubString replacements
- Drops, shifts, and splits existing annotations appropriately
- Refactored `_insert_annotations!` to work with annotation vectors directly
- Adjacent replacements with identical annotations are merged into single regions
- Lots of tests (thanks Claude!)
Performance is strangely poor. For the test case mentioned in the REVIEW
comment within `_insert_annotations!` we should be able to perform the
replacement in ~200ns (compared to ~70ns for the equivalent unannotated
case). However, for two reasons that are beyond me instead it takes
~4400ns. See the REVIEW comments for more details, help would be much
appreciated.