WIP: refactor forking logic into a 'processor'

Potentially support different types of processors

Not actually expecting a merge here yet, just looking for feedback on the general direction.

Goals:
- extract all logic related to forking into a separate class
- make it easier/possible to support alternate processor models such as threading

Not really sure if "processor" is the right word