Make chars unexported and have it copy internally on update

Simplifies API some and allows reverse to work neatly in place. Also
allows getting rid of the direction, and means if the user updates the
slice externally the behavior is more predictable (no change until they
explicitly ask for it).