refs #12202 per-tenant QOS enhancement

The current logic makes a aggregate call grouped by tenant to know the task count per tenant. It then creates a tenant list up to 5000 entries. The proposal is to have a new capped collection just having two field containing tenant and queue names. So, when a new task gets added to the queue, an entry is also made into this collection. It will be capped to a 1000 entries. On the consumption side, spawn a new thread or process that runs a cursor on the capped collection. When a tenant name gets added to this capped collection, it will check if the tenant is present in the current running list. if not, it will signal to invalidate the current list so that main celery worker thread/process will re-build the list again on the next task de-queue. The check to see if the tenant is present can be optimized by keeping a set of distinct tenant names so that lookup is fast.