Avoid un-necessary decode in startsWith/endsWith

As requested in #2503.

Perhaps it's overkill?
Well, it makes me uneasy because it is ambiguous. It's easy to misinterpret such code, since it's not clear if you're comparing code units or code points. I think such things should be explicit: the user can use `s.representation.startsWith(b)` or `s.startsWith(cast(dchar)b)`.