stdlib: Implement (write-u8)
runtime: Fix mismatched new[]/delete

This is harmless on most platforms but technically incorrect.
runtime: Have StringCell use validated UTF-8

This greatly increases our robustness in the face of invalid UTF-8. R7RS
explicitly states that calling (utf8->string) on invalid UTF-8 data is
an error so we're free to completely disallow it.

- Introduce utf8::validateData(). This will strictly validate UTF-8 byte
  sequences for missing continuation bytes, overlong encodings,
  truncated input, etc. If an invalid byte sequence is encountered then
  an utf8::InvalidByteSequenceException is thrown. On success it will
  return the number of characters in the data

- Change StringCell to validate UTF-8 data except when converting from a
  SymbolCell (which must be UTF-8). If this fails the UTF-8 exception is
  allow to propagate to the caller.

- Simplify the logic in StringCell now that it only deals with
  prevalidated UTF-8 data. This makes the code easier to follow and more
  efficient

- Have (utf8->string) catch UTF-8 exceptions and raise them as Scheme
  errors

- Make UnicodeChar::isValid() return false for all code points >
  0x110000. These aren't valid Unicode code points and we can't encode
  them properly

- Have (string), (list->string), (make-string), (string-set!) and
  (string-map) check for invalid code points and raise a Scheme error if
  they're invalid

- Add many tests for dealing with invalid UTF-8 byte sequences and code
  points

- Add assertions throughout the code to catch places where we assume
  callers are validating code points