Update otter to work with the latest changes to the Effect dispatcher API

I worked on improving the Effect API over the weekend, and this PR updates Otter to work with that changed API.

The main changes in Effect:

- The `perform_effect` method on intents is now deprecated
- The `perform` function now requires you to pass in a dispatcher that supports all the intents you'll use in your application
- `TypeDispatcher` does type(intent)-based dispatching to a performer function
- `ComposedDispatcher` composes multiple dispatchers together
- resolve_stubs also requires a dispatcher, just like perform.

However, to maintain some semblance of backwards compatibility, a "legacy_dispatcher" was added to effect.twisted that maintains support for the old perform_effect methods. So this branch isn't as big as it would have been otherwise :)


Why this change? Isn't `guard` already doing this?