better tracking of max_worker_limit

`workers.size` is not reliable as the signal to decrement a worker is not instantaneous. You can call `master.remove_worker` and `master.workers` and the result may be the same before and after the `remove_worker` call. Instead we will manually keep track of workers via the limit. We set it on the first pass and then decrement ever time we want to remove a worker.