code: function start(priv, callback) {
    check(priv.started, 'slider.started').is.False();
    check(callback, 'callback').is.aFunction.or.Undefined();
  
    priv.startCallback = callback || noop;
  
    window.addEventListener('keydown', partial(keyBasedMove, priv), false);
    priv.elem.addEventListener('click', partial(clickBasedMove, priv), false);
  
    priv.upgrader.onSlideUpgraded = acceptSlide.bind(null, priv);
    priv.upgrader.start();
    priv.phaser.addPhaseListener(partial(onPhaseChange, priv));
  
    on(priv, 'slideChange', changeDot.bind(null, priv));
    priv.started = true;
  }
docs: Upgrades DOM elements and shows the first slide.
  
  Starting procedure involves manipuilating DOM and waiting for changes to be visible on the
  screen, therefore slider will not be started immediately after returning from this call.
  After all slides are upgraded and visible on the screen, given **callback** will be called
  by the slider. At that time it's safe to use all features of the slider.
  
  ```js
  slider.start(function() {
  slider.currentIndex = 1;
  });
  ```
  
  @param {Function} callback that will be called after all slides are upgraded
  @precondition ${link Slider.prototype.start} was not called on this slider
  @postcondition calling ${link Slider.prototype.start} again will throw exception
  @see ${link Common.AUTOBOOT}
  
  @fqn Slider.prototype.start