Use tokenized event to determine tab style

`TokenizedBuffer` (and `DisplayBuffer`) now emit a `tokenized` event once a buffer is fully tokenized. They also emit a `tokenized` event when the buffer's grammar changes and is re-tokenized.

`Editor` uses this event as a trigger to determine if a file should use hard or soft tabs. The tokenization event is needed because comments at the top of a file may contain different tab styles than the code and should not be used to determine the tab state. This information is only available after the buffer is tokenized.

Closes #2421