Cache Execution evaluations

closes #1055 
b.zip(c) should generally not have b being a parent of c, but it could be. Imagine: b.zip(b.map(fn)). we would first schedule the execution of b, then when scheduling c = b.map(fn) we would find b in the cache, and would reuse the future there.