Revamped the threading evaluation of Graphs
When evaluating a Graph in "threading" mode, the higher-level API from concurrent.futures
will be used, providing an easy option to control the number of threads being spawned, as well as providing more useful information in case a Node causes an Exception during evaluation.
Note that the API for the "threading" mode changed and instead of a "submission_delay", the "max_workers" keyword controls the behavior of threading evaluations.