Fix up Buffer's handling of all the encodings

Mild overhaul to finish up Buffer encoding work which was started in the ["Strings" pull request](https://github.com/tessel/runtime/pull/542) but wasn't really fully implemented or thoroughly checked over.

Highlights:

- adds utf16le encoding/decoding (which had been completely absent)
- improves ascii/binary/hex/base64 logic too
- generally cleaner in/out logic
Ah, didn't realize that's still an open PR. Here's what I'd like to do overall, not sure how it fits between these two changesets, but:

- for starters, obviously, just one tm_str_to_utf16 implementation (living in tm_utf16.c I would say)
- to properly support both regex (native) and buffer encoding (little endian) usage, it should take an endianness argument like yours does
- I think instead of exposing a `TM_ENDIAN_HOST`+`TM_ENDIAN_SWAPnn(x)` macro combo we would be better served by `TM_ENDIAN_SWAPnnTO(e, x)`, i.e. you say the result you want (native/big/little) and it does-or-doesn't do a swap [naturally could be based on the same sort of ternary using `_TM_ENDIAN_HOST` of course but now that's an internal detail].