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.
IIUC, this function only puts one task in the FuturePool? multiple invocations of this function are required for concurrency. Here is a clearer approach.

1. Remove the futurePool here.
2. On line 159:
Future.join(
       nodesOutEdges.map { n =>
             sem.acquireAndRun { futurePool (mark...) }
       ).map(_ => (table, nodeIdSet))