sync: allow async waits to be canceled