Pull out WorkflowOp merging as a separate operator

This gives us another option for testing workflow construction, which should be helpful as things continue to get more complicated.
Yikes. This is how I got the compiler to accept that `op.rewrite` preserves the type. Is there a better way?