Avoid un-necessary decode in startsWith/endsWith

As requested in #2503.

Perhaps it's overkill?
Um, what's going on here? If I saw this I'd have no idea what it would do. Apparently it decodes the haystack into a dchar range, then compares dchars with the ubyte? I'd think it checked the string representation.