This looks like it has a lot in common with `run`.  We should look for a way to extract the common logic -- otherwise it'll add a maintenance burden to keep them in sync.  Same with `run_examples_parallel`.

Actually, I wonder if we can come up with an injectable run strategy abstraction that can have parallel and serial implementations?