A new stacking of classes to make up Executors:
The new CoreExecutor holds the generic executor behavior, while the specifics are encapsulated in StepHandlers.
- reduce check_step_health polling rate to reduce calls to k8s api
- more robust k8s error handling
- the multiprocess step handler is mostly for faster debugging for now, will remove it from this diff. Still curious if you have comments on that approach. The k8s step handler doesn't need to keep anything in memory (the init context can be refactored out, while the multiprocess has a bunch of internal state. It's possible that could be refactored to just storing a PID, but that seems non trivial)