crimson/asok: do not assume the order of param eval
* do not assume the order of parameter evaluation, before this change,
we have `do_with(cn.input(), cn.output(), std::move(cn) ...)`, see
https://en.cppreference.com/w/cpp/language/eval_order,
> side effects of the initialization of every parameter are
> indeterminately sequenced with respect to value computations and side
> effects of any other parameter.
we cannot move `cn` out and then call its member functions. so
introduce a struct for capturing its input and output.
* move `do_until_gate()` into `start()`, no need to check if
gate is stopped in `safe_action`, as `sestar::do_until()` will do
this for us.