refactor agent

Factor task monitoring and health classification into a new class, TaskMonitor, that gauges task health based on events from multiple task runs and then reports task status along with health to the agent model via the status updater.

This simplifies a lot of the agent components and lets us have less shared mutable state floating around.
No timeout on the awaitTerminated method?