"Replace with Pretty-Printed JSON" and the base64 encode/decode
context-menu items go through the fold path (replaceRange:withLines:
promptLength:-1) with reason .fold but create no FoldMark. When the
replacement had more lines than the selection, delta > 0 and
ResilientCoordinate.linesDidShift tripped it_assert(delta < 0),
crashing in release builds.
Remove that assert and handle both signs: use the posted replacedRange
(deriving the range from delta is wrong when the buffer grows), and for
a plain replacement with no FoldMark invalidate coords inside the
replaced region instead of drifting them onto unrelated lines. Coords
below the region shift by delta regardless of sign. Adds tests covering
growth/shrink for coords inside, at the first replaced line, and below.