Allow a single worker process to manage multiple children

Rather than running N separate processes on a worker node to
process N simultaneous jobs, use a single parent worker process
which will poll for jobs and launch child process as needed up
to a maximum defined by conf value max_child_processes.

Includes a refactoring to clean up and separate the
single process and parent process worker code to eliminate
a lot of conditional code depending on configuration.

Also updated logging to be more consistent and to record worker
id, parent pid, and child pid (where applicable) to help with
tracing.
Yeah, probably need to document these better. There's some race conditions that can occur since the signal handler (_terminate) gets kicked off in it's own thread while the main thread is still polling for jobs and potentially kicking off more child processes. Coupled with the nature of forking and the parent and child needing to handle the term signal in slightly different ways, it makes for some tricky code.