Simplify engine, removing event handlers

The current approach to driving cluster-level decisions using event handlers without a great level of coordination is making fleet incredibly hard to operate in a real environment. This patch removes all of the engine's event handlers and simply re-runs the CheckForWork loop every 5s. It also uses the simple TTL'd locking mechanism to prevent multiple engines from running at once.

This still has some kinks to work out, but it basically works. Scheduling time has slowed down dramatically, since the user has to wait on the reconciliation loop to run twice, so maybe that's a dealbreaker?
5s was my best guess, taking into account how long the TTL on the TimedResourceMutex objects are (10s). This has a big impact on how long it takes to schedule things, since it takes two CheckForWork iterations to land a Job on an Agent. I might tighten it up to 2s just to make sure our functional tests don't arbitrarily fail.