Move dispatcher to separate file, add extend 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.extend` method a la `singledispatch`.