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.
OK @agrewal IIUC, you suggest to
1. create ArrayBasedDirectedGraph class to handle everything in a class instead of object
2. We use companion object apply method to read array based directed graph. It takes only parallelisationLimit: Int (no: ExecutorService),
3. ArrayBasedDirectedGraph has lazy val futurePool: FuturePool = FuturePool.unboundedPool
4. There is a semaphore field - initialized to parallelisationLimit
5. You can create future in the pool only when having the semaphore
6. All methods invoked by the main apply() method use the futurePool from the class

Is this correct?