Language switcher: connect to prefs & clean up some code

It may be easiest to review each commit individually, since they're fairly distinct:

Second commit - new feature:
* Add "Set as Default" menu item to status bar language switcher -- adds a permanent file extension mapping to preferences, based on the current file's path-specific language override (if any) and its file extension.

First commit - cleanups:
* Make LanguageManager the official public API that is used to set per-file overrides, rather than proxying through Document objects - remove `Document.setLanguageOverride()`
* Clear path overrides when switching projects, so it's more obvious to users it's not something that gets persisted across sessions
* Simplify how JS Code Hints listen for language updates: remove dependency on `"currentDocumentLanguageChanged"` event; remove unneeded extra 'if' tests

Third commit:
* Improve "Set as Default" menu item -- gray it out when the current file has no path-specific override (i.e., when the current language already is the default for the current filetype)
* Extend DropdownButton / DropdownEventHandler to support disabled items.
* In the process, clean up dropdown keyboard navigation substantially -- fixing #8433.

~~For clarity, I'd ideally like the "Set as Default" menu item to be grayed out when there is no path-specific override on the current file (i.e., when the current language already _is_ the default for the current filetype)... but disabled items aren't a think in DropdownButton yet and I will need to do some cleanup there to get it working -- so I wanted to post this initial for review first.~~ _(this is now implemented)_
Yeah, this makes sense philosophically: prefs are fundamentally public. I vaguely remember creating some pref or view state value that had a leading underscore, but otherwise they are values that need to have some level of compatibility guarantee just like a public API.