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.
Hmmm. The problem is this is generated up in the worker level where it doesn't keep a handle to the current job. Even the job processor doesn't by default. Tho it does pass thru to the worker as a convenience. Perhaps adding an optional job (or job id) param to the get_worker_tag method in the JobProcessor class. If present, it can include an abbreviated job_id. Like you said, the tag could get REALLY long. But part of my rationale for the tag is to try and make the log a bit more machine-read-friendly for easier automated parsing.