pub fn terminate_async<C, Func, Fut>(cleaner: Func) -> PartialSession<C, End> where
    C: EmptyContext,
    Func: 'static + FnOnce() -> Fut + Send,
    Fut: Future<Output = ()> + Send