[WIP] init cancel watcher

@cenkalti I need to create a new Pull Request for the watcher cancellation. It is hard for me to work on your original pull request, since I want to separate cancellation from other changes. 
1. Make sure cancellation works. [This pull request will do this]
2. Fix up some locking issues.
3. Add a stream watcher type. 

I am very sorry that I might take some of your idea, but cannot merge in your pull request. 
If you really want your pull request to merge in, I might need to take extra time to cherry-pick yours.