Revamp the way key presses are parsed.

This allows things like C-S-- (i.e. control shift dash) to work. It looks
weird, but better for it to work than to parse to wacky mystery key combo.
A basic framework for undo and redo.

This will probably need to get smarter, but it's already decently workable.
Various niggling bits.

The biggest niggle is that we no longer allow the point to be on a "fake" line
beyond the end of the buffer. We have a real line there (or not when we
properly handle files that lack a trailing line separator).
Added transpose-chars. Oh the subtle complexity.