new std.array.replaceLast

While testing of replaceFirst with utf8 string I found a bug and fixed that.
This lead me to add replaceLast because I needed such a function in the past and didn't want to retro four times.
The ideal solution would be something similar to the current `byCodeUnit` or `byCodePoint`, where all of the specialcasing to deal with narrow strings are localized in one place, and everything else around it simply uses the straightforward range API. The uglification you're referring to only happens if the specialcasing spills from Phobos into user code. But that wouldn't happen if we, in some foggy distant future, make bare strings no longer ranges (you have to use `byCodeUnit` or `byCodePoint` or `byGrapheme`). IOW, strings become "containers" rather than ranges. Then all the necessary specialcasing can go into the "wrapper" ranges derived from the container, and we will no longer need to uglify neither Phobos algorithms nor user code.