Carousel refactor

This change included general logic cleanup as well as the following changes:

Fixed issues
* Clear any timers on `componentWillUnmount` or null any async actions via `this.isMounted` which would cause set states after the component has been unmounted, resolves #112.
* Prevent default on `next` and `prev` callbacks which stops hashes being set to the url.
* Clear auto slide interval timer on manual change to stop multiple timers being set.

Added functionality
* Added `onSlideEnd` prop - useful for queuing state changes.
* Added basic unit tests.

@stevoland would be good to get a good review of this as i ended up changing a few things around :)