Huge refactor pass.

While implementing the UTF-16 stuff, I noticed a lot of duplicated boilerplate. This has all been moved into CEncoding. CEncoding no longer specializes per-encoding, but defers this to encoding-specific CTraits specializations.
Changed how encodings specialize.

Encodings now specialize on a traits class rather than an encoding enum. This is more correct, if not more verbose.

Traits classes themselves still specialize on the encoding enum.
Cleanup pass, reintegrated UTF-16.