move a bunch of the execution logic into the RunContext