Lwt.Canceled support for MultiWorkerLwt
Summary:
This is actually relatively simple. The general idea:
1. `MultiWorkerLwt.call` runs N worker controllers in parallel using `LwtUtils.iter_all`
2. Someone tries to cancel a thread which is running `MultiWorkerLwt.call`
3. Canceling the `iter_all` propagates the cancellation to each of the N worker controllers automatically
4. A worker controller which is sending a job or merging a job fails immediately (the worker process is idle)
5. A worker controller which is waiting for the worker process to finish a job handles the cancellation, signals all workers to cancel, and waits for its worker to finish being cancelled
6. `MultiWorkerLwt.call` waits for all worker controllers to finish being cancelled and then re-enables all the workers
Reviewed By: avikchaudhuri
Differential Revision:
D8161600
fbshipit-source-id:
e00fadc690cc73b610f46455260499c121f6087f