Cache Execution evaluations

closes #1055 
I am using the lazy parameter `(: =>)` in the same way a mutable map does with .getOrElseUpdate. So, if we have not already evaluated ex, put the code to evaluate it there. Now you can actually get the future into the cache before it is complete and so parallel operations (such as the zip) will not both recompute parents they need. That is why we return both the cache BEFORE the future is complete (BUT containing this execution) and after it is complete, as the flatMap may cause more Executions to be evaluated along the way.

If we only had the cache after the future, zips would be made into a sequence, and the case of a diamond (b and c depend on a and b.zip(c) is what you are evaluating), we would still serialize. Here, we will get a into the cache when we start return from b, and then c can look at the cache now, and see a, and only wait for a, not b.