Deployer

Adds a deployer component, which uses the queue (#547) to schedule deployments using different strategies (currently one-by-one or all-at-once).

Resolves #602.
We could handle this TODO by just exiting the process if `worker.Start` returns an error, then the scheduler will restart the deployer process which will start a new worker, WDYT?