Create a queue for all schedule-able algorithms
The AvalancheScheduler preserves algorithm ordering by only scheduling them when there is an available thread. However, the current implementation has the side-effect of creating scheduler overhead when there are very many algorithms available to schedule, relative to the number of threads. The majority of these schedule attempts will be discarded, causing a repeated cycle of retrieving precedence graph states and then calling promoteToScheduled.
By creating a queue for all algorithms that can be scheduled, the order of execution is preserved in the queue, and all results of evaluating the precedence graph are guaranteed to be used first time. This gives a dramatic improvement to scheduler performance in scenarios where many algorithms can be executed concurrently.
This is illustrated in the attached plot:
The test is conducted using the JO in !865 (merged), and comparison is made to the Gaudi master branch, and to !863 (merged) (scouting).
NB: this MR should be applied as well as !863 (merged)