Tweaks to string comparison functions

Some code redundancy had built up due to the order in which the functions
had been added, and the fact that some of them used to treat the case
sensitivity of the two arguments differently.

Refactored EqualsNoCase so that there's a return statement at the end of
the function. While I was at it, a slight change saves one cycle per inner
loop on ARM, because the terminator check is performed on the tolower()ed
value rather than having to stash away the value of *s2 across the tolower()
call.

GCC's generated ARM code, at least at the time of writing, isn't quite
optimal - it hasn't spotted that you can post-increment the loads via s1 and
s2 for free, preferring instead to keep the original s1 and s2 and inventing
a single index variable for both strings. You'd think that having written it
in a form that maps to 2 rather than 3 registers would have been enough of
a hint to the compiler, but apparently not. Maybe GCC will improve in future.
Split StringUtils methods StartsWith & EndsWith according to case sensitivity

Formerly, there was an optional parameter (default off) to indicate that
these operations were case-*sensitive*, which is actually computationally
simpler to perform. Now they are split into separate functions for the
two cases, with the naming convention consistent with EqualsNoCase:
  StartsWith       - case-sensitive
  EndsWith         - case-sensitive
  StartsWithNoCase - case-insensitive
  EndsWithNoCase   - case-insensitive

With the case-sensitive versions now easier to type, it will hopefully
encourage future developers to use them in preference.