Avoid un-necessary decode in startsWith/endsWith

As requested in #2503.

Perhaps it's overkill?
OK, I don't see a good compromise, so I give up. I was going to say that `find("é", "é"[0])` should do a `memchr` and return true, but then that would imply that `countUntil` should do that as well for consistency, and that in turn would mean that its result would change depending on if you five it a char or string (as it would be counting code points vs. code units). The whole thing is FUBAR - I hope you're happy, @andralex.