Forward an exception to the watcher when a cancel is requested
Use shared_ptr to allow the usage of weak_ptr to cancel an async_operation

It avoids a crash if the cancel comes after the notification and the
connection is destroyed.
There are still some case one must be careful like the fact that an
async_handler could be reused to cancel the next operation instead of
the current one. However, such considerations are not in the scope of
the library