The methods in SideEffectUtils.h (and their implementations in
SideEffectUtils.cpp) seem to have similar intent to methods already
existing in SideEffectInterfaces.h. Move the decleration (and
implementation) from SideEffectUtils.h (and SideEffectUtils.cpp)
into SideEffectInterfaces.h (and SideEffectInterface.cpp).
Also drop the SideEffectInterface::hasNoEffect method in favor of
mlir::isMemoryEffectFree which actually recurses into the operation
instead of just relying on the hasRecursiveMemoryEffectTrait
exclusively.
What is the relation with these changes?