Forge parallel patterns should use the language of generators (collect, reduce, hashCollect, hashReduce) to simplify the code generation and error checking required in Forge, similar to Delite. The various front-end instances (map, zip, filter, etc.) should be different parameterizations of the generators. We should not need to use the simpler DeliteOp interfaces at all (like DeliteOpMap), and instead should be able to generate all DeliteOpLoop[_] instances with the correct loop bodies.