Implementing a Source Handlers interface for supporting adaptive formats

The source handler pattern came from the need to support adaptive formats using the Media Source Extensions (or faux MSE with Flash) while keeping the code optional and external to core since it's very heavy. I'm hoping to get some feedback on the current implementation, especially from anyone working on the HLS plugin (e.g. @dmlap, @gkatsev, @seniorflexdeveloper)

### TO-DO
##### HLS (to prove this will work)
- [ ] Implement duration in Flash-MSE (videojs/videojs-contrib-media-sources#18)
- [ ] Combine Flash.currentTime and HLS.currentTime so they're the same (videojs/videojs-contrib-hls#170)
- [ ] Move the HLS setCurrentTime code into a seek event handler (videojs/videojs-contrib-hls#175)
- [ ] Update the HLS plugin to be a source handler  (videojs/videojs-contrib-hls#170)

### The source handler interface

    // Define a source handler
    var mySourceHandler = {
      // does the handler support source object type, return probably, maybe, or ''
      canHandleSource: function(sourceObject){},

      // receive the source and tech. Do whatever is needed to handle the source format.
      // through the tech you have direct access to the video element (or flash object), events, and the tech API
      handleSource: function(source, tech){}
    };

    // Register the source handler with the specific tech (source handlers are tech specific)
    vjs.Html5.registerSourceHandler(mySourceHandler);
    // or
    vjs.Flash.registerSourceHandler(mySourceHandler);

After registering a source handler it will be included when the tech is asked if it can support a source (Html5.canPlaySource) and handed source types that it supports (Html5.prototype.setSource).

<strike>I've currently only implemented it on the HTML5 side, but Flash should look identical.</strike> (done)

Native format support is also set up as a source handler here, which allows it to be prioritized in case we want our own HLS support to come before native, for example.

### HLS-HTML Source Handler Pseudo Code

    videojs.Html5.registerSourceHandler({
      canHandleSource: function(source){
        if (MSEisSupported() && sourceIsM3u8(source)) {
          return 'maybe';
        } else {
          return '';
        }
      },

      handleSource: function(source, tech){
        return new Html5HLS(source, tech);
      }
    });

    function Html5HLS(source, tech){
      var mediaSource = createMediaSource(source);

      tech.setSrc(mediaSource.blobURL);

      tech.on('seeking', function(){
        var seekTarget = tech.currentTime();

        updateMediaSource(seekTarget);
      });
    }

    Html5HLS.prototype.dispose = function(){};


### Overview
<p align=center>
  <img src="https://cloud.githubusercontent.com/assets/166/4586487/6edfaa9a-5018-11e4-913d-376f206dd186.png">
</p>

### Native Source Handler
<p align=center>
  <img src="https://cloud.githubusercontent.com/assets/166/4586491/818458da-5018-11e4-8b63-f9dd4c3c7b3f.png">
</p>

### HLS Source Handler
<p align=center>
  <img src="https://cloud.githubusercontent.com/assets/166/4586492/8b705d80-5018-11e4-85cb-3cb8a57411ed.png">
</p>

### Ideal Code Sharing
<p align=center>
  <img src="https://cloud.githubusercontent.com/assets/166/4670257/64f77e38-5575-11e4-9ca6-8bbff44d3cd7.png">
</p>