Make concatenation of SubString{AnnotatedString} preserve annotations (#51806)
`SubStrings` have been overlooked, and thanks to a few compiler quirks
(relating to inlining and effect analysis), adding support for them is
unfortunately a little more complicated than adding a `|| s isa
SubString{<:AnnotatedString}` clause thanks to the new generated
runtime-checks.
To maintain the zero-overhead non-annotated code path, we need to
implement a separate function `_isannotated`, which we also make use of
to simplify the current join method.