Various general improvements

Made the following improvements:
- Replaced backspace/delete code using DTE with code that directly
modifies the text buffer. Backspacing/deleting tabs now occurs in a
single step, so it takes a single Ctrl+Z to undo. (Replacing virtual
spaces with real ones causes some backspace operations to take two
undos. This could probably be improved.)
- Backspace/delete no longer treat whitespace in the middle of code as
tabs.
- Backspace/delete and arrow keys no longer treat trailing whitespace as
tabs.
- Fixed a potential ArgumentOutOfRangeException when pressing arrow keys at the end of a file.

I think this makes everything behave as intended (leading spaces are tabs, everything else are spaces), but it's worth checking everything over to make sure I haven't broken anything.