runtime: Use std::size_t

Using bare size_t compiled on OS X but it correctly fails on
Linux/libstdc++. Use the std:: prefix
runtime: Add constants for first, last code point

Instead of hardcoding 0x110000 in the runtime add a constant with a
comment on what that number means
runtime: Factor out slackless string logic

The logic for testing strings without allocation slack was duplicated
and was leaking memory. Consolidate and add a free() for the test
allocation.
runtime: Descriptive UTF-8 error messages

Include the byte offset/range and error type in UTF-8 error messages.
This is factored out to a helper function as it will be reused for
(read-char) etc.
runtime: Fix wriing hex string escapes

- Cast the written character to int so it isn't interpreted as a raw
  character

- Follow the hex escape with a semicolon as required by R7RS
runtime: Implement (peek-char), (read-char)

This is significantly more complicated than (read-u8) because it needs
to parse multiple UTF-8 input bytes as a single atomic character. It
also needs to allow the input stream to recover from invalid UTF-8 byte
sequences.
runtime: Implement (call-with-port)

This is implemented in C++ so it can take a weak reference on the port.
This allows the GC to collect the port if it's no longer referenced.
runtime: Implement (write-char)