schedule/unschedule expiration is now asynchronous operation

The operation is now pushed to a queue and the expirer thread will take care
of executing it after running the expirer_mux