fix: make bench broken by composition operator renaming
restore direction of nreplace (right to left), slower implementation
add BatSubstring.unsafe_substring injection function for performance reasons
(cherry picked from commit 785af254da3d06271df0946002b9f7e653aaec51)
Add all proposed implementations of nreplace in bench_nreplace.

We try to bench these against a realistic workload composed of lines
of various length from a few chars up to 5k chars, exercising all
possible cases (short sub, long sub, not found, frequent subs, no sub...)

Gasche implementations seam to win hands down.