Avoid un-necessary decode in startsWith/endsWith

As requested in #2503.

Perhaps it's overkill?
> You mean if I search for a char in a string, it is going to decode??

No, I mean:
```D
find("é", "é"[0]); //returns false
find("é", "é"[0 .. 1]); //returns true
```
In neither cases does it decode. I guess `find` just takes it for granted the passed strings are valid utf sequences, and in this case, it is not.

I'm not sure how to reply to you other proposals. I don't think adding special cases is a good idea in general. Thoughout all of algorithm, strings are handled as a range of codepoints. Always. The only ambiguity is when an individual `char`/`wchar` is used with "values" that don't fit as a single codepoint in that encoding.