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.
Merge pull request #128 from pieterv/carousel-cleanup

Carousel refactor