panner.ready(immediate) returned a promise to allow scheduling of panner.navigate(), decor.start(), buffered popstate handling. This probably isn't the right solution since it relied on promise.then() only being called once. Also it made the scheduled functions more complex because they had to call a `done` callback when complete instead of being allowed to return a promise like other async code does.

panner.ready().then(fn, fail) is now bfScheduler.whenever(fn, fail) where `fn` and `fail` can return a promise for async operation.

panner.ready(true).then(fn, fail) is now bfScheduler.now(fn, fail)
panner.triggerStateChange() -> bufferPopState()
panner.handleStateChange() -> panner.handlerPopState()