decouple generic actions from RunOnce

Introduce lazy action runner; given a thunk, it'll invoke it when being
Performed to generate its actions. This allows the execute action to be
created before we know the handle/etc. of the RunOnce.