rewrite everything. all tests pass, but they are insufficient.
- get rid of resolve_stub*
- add perform_stubs, which uses perform()
  - perform() was modified to accept a chain_effects boolean
    argument in support of perform_stubs
- all dispatchers take the top-level dispatcher as the first argument
  - there was actually a bug in existing code because only perform_effect
    methods would get the toplevel dispatcher, not "third-party"
    dispatchers. so doing parallel effects in twisted would not support
    custom dispatchers.
cosmetic changes to API/code
get rid of one bounce which I believe is unnecessary
docs