Benchmarks: Fix race condition in abort

Fixes a race condition in the logic that handles aborting benchmarks by
separating out the logic to run benchmarks into two phases: create and
start. Abort requests will not attempt to cancel benchmarks which have
not been properly initialized on the executor nodes.

New benchmark requests are first created in the cluster meta data in
state 'INIT'. After this, all bookeeping state is initialized on the
executor nodes. Only after this has completed successfully on all nodes
is the benchmark moved into 'STARTED' state. Finally the benchmark is
actually started on the executor nodes.

Major ancillary changes include:
- Added ability to submit a benchmark and immediately pause it
  ('pauseOnSubmission'). Helpful for testing.
- Added ability to resume paused benchmarks.

Minor ancillary changes include:
- Factoring out state bookeeping from the executor class.
- Add mock testing framework to validate cluster meta data.
- Add mock testing framework to allow suspension of execution in between
  iterations.