implement much better tokenization for programming languages.

it splits on:
- every line break
- bunch of whitespace
- bunch of word characters
- every non-word characters (e.g. punctuation)