Source nodes and pipeline breakers need to schedule new thread tasks. These tasks run entire fused pipelines (e.g. the thread task could be thought of as analogous to a "driver" in some other models).
At the moment every node that needs to schedule tasks (scan node, hash-join node, aggregate node, etc.) handles this independently. The result is a lot of similar looking code and bugs like ARROW-15221 where one node takes care of cleanup but another doesn't.
We can centralize this by moving this scheduling into the ExecPlan itself and giving nodes an ability to schedule tasks via the ExecPlan.