Adds sliding-window parallelization to Push/Pull operations

A layer can only be pushed/pulled if the layer preceding it by the length of the push/pull window has been successfully pushed.

An error returned from pushing or pulling any layer will cause the full operation to be aborted.

This push/pull sliding window size is currently fixed at 4, and we'll have to run benchmarks to decide on future behavior.