providers: begin rework, meet IptvProvider

  basic building block will be used as the generic interface to all providers
test: create test directory

  add tests (we use the mocha framework)
  so far only a few basic tests for the ongoing providers rework
providers: further IptvProvider interface experiments
providers: build http/url providers on top of iptv
test: check url provider can grab an url
provider: url provider fixes
proxy: use new providers
providers: rename
more url provider fixes
providers: port streamdev provider
vlc: rename provider
providers: port vlc provider

  note: no pooled host support for now
cleanup: remove legacy simple http provider
config: update sample config file with providersV2
clarify the role of this._channel, cleanups

  this._channel to be used by the provider to operate channel selection on the
  source. It should not be used for other purposes (eg channel name registered
  with stream manager)
tests: add skeleton for VLC tests

  include test playlist grabbed from freebox tv
fix channel binding not cloning providers properly

  channel binding did not work as expected, indeed internal status variables
  such as _started were written in the channel wrapper rather than the source
  provider (this is a basic consequence of how inheritance is implemented in
  JS: inherited fields are COW).

  we work around the issue by storing *global* internal status variables in a
  _g object. Since internal global variables are now accessed by derefering in
  intermediate object, this won't cause internal status variables to be copied
  on write
with channel binding fixed introduce provider pools
update sample config with pooled example
introduce multi source provider

  AKA: heterogeneous pool

  this is a proof of concept, lots of debug logs are floating around.
  notice how nicely configuration is now handled for providers.

  known issues:
  right now, only "play" works properly, "stop" has an incorrect behaviour :
  stop() needs to be propagated from the lowest-level provider, to pooling
  wrappers. We will probably need to emit() an event of some sort.