Introducing a new rewrite driver to work on a specified list of ops

MLIR currently provides two rewrite driver utilities: applyPatternsAndFoldGreedily and applyOpPatternsAndFold. The former simplifies an entire region isolated from above (typically and pervasively used on a `FuncOp) while the latter is completely local to a specified single op. There currently exists no efficient way to rewrite and simplify a desired list of ops together such that rewrites are restricted to only those list of ops and optionally other “directly” impacted ops.

A rewrite utility focused on a supplied list of ops is desirable to authors of transforms and transforms utilities for the following reasons:
(1) run any simplification and cleanup at the end of a transforms pass/utility so as to only simplify “affected” IR. Such a rewrite driver allows one to clean up any unoptimized IR introduced by the utility and makes it easy to write test cases while not performing unrelated and undesirable whole IR simplification that may invalidate other state at the caller.
(2) provide greater efficiency as well as more simplification when compared to using applyOpPatternsAndFold repeatedly op by op.

This revision introduces such a rewrite driver: https://reviews.llvm.org/D106232
It also provides a strictness flag to pick between the two commonly desired modes to restrict the scope of simplification.