make sure timer does not run with pointer to delete objects

move deletion of InternalSubscription to asio service to make sure timer. does not run with pointer to delete objects
There is 2 things here:

1- using ioservice to stop a timer is not a hack, this is the only
race-free method.

2- we need to keep shared pointer until the ioservice task has run. There
is 2 ways to do it: 1) pass it as lambda parameter or 2) leave it in map
and remove it from ioservice thread, but then we need to add lock mutex.
Should I implement 2) ? maybe it is cleaner/easier to understand