The list scheduling algorithm in scheduleTaskList allows a worker to be in exactly one of four states at any given time in the schedule: evaluating code, sending data, receiving data, or idle. This means that the algorithm models End-Point Network Contention. The current implementation is based on the 'classic list scheduling model', and is not correct. In particular, the implementation will fail to schedule any statements in parallel if the graph has a single root node.
We can fix this by using a contention aware algorithm.