Currently when executing ProvisioningTask, it occupies a thread and do polling from there (poll for RUNNING or DELETED status). If there are large amount of concurrent runs, a large amount of threads is needed. We should refactor such that each execution just do a limited amount of work (e.g. check the status) and then resubmit the task to the executor for the next iteration. In that way, we can control the number of threads by having them sharing a thread pool.