Benchmarks: Re-factored benchmark infra

Major re-factoring to use a dual-channel strategy for executing
benchmarks. Uses cluster metadata for managing lifecycle events, but
transport channel to send benchmark definitions and results between
master and executor nodes.
@imotov I think you have valid concerns. The reason we decided to implement a dual-channel strategy was to leverage the simplicity of managing state transitions though ClusterStateListener events, while at the same time not overloading the cluster metadata with the relatively large payloads of the benchmark definitions and data points. I think this is a fair tradeoff given that the worst that can happen on a master node failure is that the benchmark dies and has to be resubmitted. The code has facilities to detect orphaned benchmarks caused by master failure and remove them from the cluster metadata.