Faster version of BatString.replace

This version of 'replace' only allocates a single string. On short
strings it takes 60% of the time of the old version. Perhaps most the
time is spent in 'find'.
fix: make bench broken by composition operator renaming
Faster version of BatString.nreplace

With an accompanying benchmark against other possible implementations
showing this new version being consistently faster than current one
by around 20%.

Also introduce BatSubstring.unsafe_substring (used by a benchmark but
useful in itself).