Move dispatcher to separate file, add register decorator

First, I think it's important for us to separate Dispatcher logic (adding/selecting implementations from types) from how we select Dispatchers (adding/selecting dispatchers from namespaces).  These now live in core.py and dispatcher.py respectively.

Second, I added a `Dispatcher.register` method a la `singledispatch`.

Third, I added some documentation.