Add execution control for active benchmarks

This commit adds the ability to pause and resume active benchmarks. It
adds new API calls for sending control requests.

TODO:
1. Pausing internally is implemented using a busy wait. Should this be
changed to use proper blocking concurrency primitives?
2. The returned status code can be incorrectly reported in some cases.
This is due to BenchmarkResponse.mergeState() assuming a natural
ordering of enum values.
3. Needs refactoring of test cases to use pause/resume feature.

Closes #6173