Create a Task whose run method includes all of the logic in ApPipeTask.runAssociation aside from Butler I/O. The new subtask should not take ownership of ApPipeTask.ppdb, as that will be an unnecessary breaking change to the configs. (The command-line interface will be different in Gen 3 anyway, and it's better to have two UI versions than three.)
This should probably be done after
DM-21877, so it can use the same approach to signal completion of PPDB writes to downstream PipelineTasks.