Address AgentState raciness

Access to the AgentState object by the Agent event handlers must be done in a transaction. Locking from the event handlers themselves gets us this. 

Agents can end up handling messages out of order, which means an Agent could bid for a Job that has already been scheduled. Allowing Agents to bid on conflicting jobs prevents an Agent from plugging itself up. The Agent still verifies a Job does not conflict before actually accepting it.