Factor out all functionality that relies on AffineForOp and AffineIfOp. When dealing with these ops, there are additional assumptions about how SSA values are defined (e.g., addInductionVarOrTerminalSymbol).
Association of columns with SSA values proved useful in places such as "SCF for loop peeling". However, these places do not deal with Affine dialect ops (they use AffineMinOp, AffineMaxOp, AffineApplyOp; but only for computing mathematical computations, as a replacement for std.addi etc.), so extracting all Affine dialect-related functionality into a derived class would simplify the class's API and avoid accidentally calling a function such as addInductionVarOrTerminalSymbol, which may suddenly raise an assertion and crash the program.
Depends On D108270