scheduler, agent: refactor: job defs and comms

First, job definitions are simplified, by removing fields that were simply
copied to the resultant ContainerConfig, and embedding the ContainerConfig
directly. Also, remove Job/TaskName from ContainerConfig, as it's a sort of
information leak that doesn't belong. That required some significant
restructuring of the scheduler task-matching code, and moving the Job and
TaskName fields to the scheduler-internal taskSpec.

Second, refactor the communications between the various components. Primarily,
refactor the scheduler/agent state machine so that changes in the agent are
appropriately reflected in the scheduler, even if the scheduler didn't
trigger them. That work isn't done, but this is a functional checkpoint.