Execute graph tasks concurrently
This MR changes the graph execution so that all nodes that are 'ready' are executed concurrently instead of sequentially. It also has the side effect of simplifying this area of the code a bit.
Some timing tests with the test graph unit test:
# frames | main | this MR |
---|---|---|
1000 | 286ms | 239ms |
10000 | 2.46s | 1.96s |
100000 | 24.50s | 20.86s |