Futures version of reading ArrayBasedDirectedGraph

ArrayBasedDirectedGraph was not very clear with `apply()` method on almost 200 lines. I've cut it into submethods and rewrite it to futures instead of ExecutorUtil's parallel works.
implicits are a little hard to follow around in code, and can sometimes lead to bugs. In this case, you are not taking a lot of advantage of implicits, might be better to make these explicit. 

Also, as I have mentioned elsewhere, in general it is better to pass concurrency around as an Int, instead of futurePools.