better s2_loop:retry semantics (breaks api)