fix
Add String(char *, unsigned) constructor

This constructor allows converting a buffer containing a
non-nul-terminated string to a String object, by explicitely passing the
length.
Remove unneeded check from String::setCharAt

operator[] already checks the index and returns a dummy writable
reference when the index is out of bounds.
Use memmove in String::remove

Before, it used strncpy, but that has undefined behaviour when the
source and destination strings overlap. memove is guaranteed to work
correctly in this case.

Note that memmove simply copies all bytes, whereas strncpy stopped at
the first nul-byte. This measn this commit also makes remove work for
strings that contain embedded nul bytes.
Remove unneeded check in String::remove(unsigned int)

This check already happens in the remove(unsigned int, unsigned int)
method that is caled, so there is no need to also check this here.
Fix bounds check in String::remove()

Previously, if you passed in a very big index and/or count, the
`index + count` could overflow, making the count be used as-is instead
of being truncated.

We can rewrite the comparison to use `len - index` instead. Since we
know that index < len, we are sure this subtraction does not overflow,
regardless of what values of index and count we pass in.

As an added bonus, the `len - index` value already needed be calculated
inside the if, so this saves a few instructions in the generated code.
Simplify String::remove(unsigned int)

Previously, this method calculated the length of the string from the
given index onwards. However, the other remove() method called already
contains code for this calculation, which is used when the count passed
in is too big. This means we can just pass in a very big count that is
guaranteed to point past the end of the string, shrinking the remove
method by a few bytes.
Allow negative indices in String::operator[] and String::remove()

Thes negative indices indicate the number of characters from the end of
the string.