pack Mappings of StringTableSlice better
StringTableSlice has an alignment of 2, given its u16 members. The
byte_len field can always fit into a u8. To give it an alignment of 1
so that it can pack well into a Mapping, we need to store the byte_start
member as separate u8 fields, and change Mapping's discriminant to a u8.
This change makes Range take up 12 bytes on a 64-bit system instead of
16, for a significant space savings.
LLVM ought to be able to optimize the load/load/shift/or recomposition
of byte_start into a single u16 load on unaligned architectures like
x86. Current Rust does not do that, but an extra instruction or two is
worth a 25% space optimization.