If the `scf.index_switch` op has no result, the current fold logic results in an infinite loop (see #98535). The is because `fold` mechanism does not support *erasing* zero-result ops. This PR moves the fold logic to a canonicalizer and fix the issue.