[MERGEABLE] Splitview With Image and Custom View Support

https://trello.com/c/A22yIIal/1282-splitview-add-view-provider-mechanics

This PR is can be merged into jeff/splitview-1x2 when ready
* Adds a MainViewFactory for view factories
* Adds support for images
* Adds support for extensible custom views
* Adds support for 1-off views
* Adds a view state cache singleton
* Fixes #6356

This is changes a few things from the old implementation:

* It's keyed off of arbitrary path filtering rather than Language, which is more flexible but less efficient (and a little more work for extension developers).  Any particular reasoning behind that change?
* The old terminology was "custom view provider" and the new term is "view factory."  I sort of like the old naming better -- in particular, "provider" is a term we already use elsewhere in Brackets.

Also, this doesn't document what `openFile()` is expected to do, or what it returns.  It looks like the expectation is that it constructs a View and calls `pane.addView()` with it, returning a Promise that is resolves when that's done (or is rejected _with a FileSystemError object_).  Would it be cleaner to just have it return a Promise that resolves with a View, and then Bracket core takes care of adding it to the right pane?  That would be a little more in line with how other provider extensibility points work...