Implement a simple history proxy to account for browsers that DO support history.pushState() but DO NOT implement `history.state`
Undeclared (and therefore global) variable `lcAttr`
Use state.cacheId as the bfcache lookup key. `cacheId` will be equal to state.timeStamp by default, but a single cacheId will persist across all states when navigating within the same page. When going back and forward in history it is the cacheId that is checked between adjacent states to see if panning or simply scrolling is needed.
Merge branch '2.1.x' of https://github.com/meekostuff/HTMLDecor into issue4
No need for saveScroll() / restoreScroll() to throw if states not in sync.
panner.ready() returns a promise which allows synchronisation between `navigate()` and popstate handlers, both of which are async operations. `navigate()` wants to begin immediately or fail, so it calls panner.ready(true). popstate handling will wait until other operations are complete, so it calls panner.ready().
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()