new packing scheme, more shortcuts, dry-er

microbenchmarks now show both byte array based implementations
(ascii-only and adaptive utf) as (sometimes by a factor of 3-4)
faster than Strings. This is a big improvement for the adaptive
version.

the byte buf utf implementation has decent performance -- edging out
Strings in a few cases.

all of these tests were done on strings that actually are ascii-only
though, and the non-ascii cases may benefit from a little love to
prevent a notable regression for the (although expected to be rare)
non-ascii cases.

memory footprint analysis shows that for small-ish strings, the
object overhead is pretty significant. Strategies for packing multiple
strings into one backing store may be beneficial if possible.

memory footprint analysis _also_ shows though that we have a free 4
bytes to use for something. This is because of memory aligning that
causes four bytes to be padded out anyway. So we could eg. cache
hashing for non-ascii versions or some other magic.