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