Switch language / syntax mode of current document

This is an update of @JakeStoeffler's PR #4276.  It's merged up with the latest master and addresses the main code review comments I made there.  I also added some simple unit tests.

I still have two concerns about merging this immediately, though:

**1)** The dropdown UI doesn't look great. It uses a native `<select>`, which is just hard to style... and the way the statusbar is laid out makes it look misaligned in this case:
![language picker](https://f.cloud.github.com/assets/1197510/1867075/419e3564-7847-11e3-85ec-1e33455f62bf.png)

It would look nicer if we used an HTML popup like code hints, context menus, and the Recent Projects dropdown... but it would definitely add a bunch more work here.  So maybe we can skate by with the current `<select>`-based UI for now.  @larz0, any thoughts?

**2)** This foregrounds all the bugs in #2911 a lot more.  I added a checklist of issues there.  Are there any that are prominent enough to act as blockers here?  (JS code hints seems like it might be the most glaring issue, but unfortunately that's one of the harder ones to fix too).
Actually, turns out there already is a LanguageManager `"languageModified"` event that handled the prefs case (as well as programmatic mapping changes via the LanguageManager API).  It's language-specific, unlike the generic event I'd suggested, but that still works because it fires both for languages that lost a mapping and for those that gained one, and DocumentManager can thus call `_updateLanguage()` on any Documents that are potentially affected (language matches either event _or_ language is the default plain-text fallback).

So ideally I think we'd clean this up such that `LanguageManager._setLanguageOverrideForPath()` also triggers `"languageModified"`, and `Document.setLanguageOverride()` could just go away... but the semi-private solution seems ok for now.

@busykai Question though -- you said you think `LanguageManager._setLanguageOverrideForPath()` shouldn't be called by others... do you think that's true of `Document.setLanguageOverride()` too?  Do we want no official public API for this for now?  (If so, we should probably underscore-prefix it too...).  If we think we'll eliminate that API later in the cleanup suggested above, that might be another good reason to not call it public yet...