[validation] Patch false positives for hook calls after loops
--- We were throwing `InvalidReact` errors on valid inputs. ```js // Input function Foo() { log("block0"); for (const _ of foo) { log("loop"); } useBar(); } // IR bb0: // log("block0"); ForOf init=bb2 loop=bb3 fallthrough=bb1 bb2: // init Branch: then:bb3 else:bb1 bb3: // log("loop") Goto(Continue) bb2 bb1: // useBar(); Return ``` We correctly compute post dominators here. ```js // In validateUnconditionalHooks console.log(dominators.debug()); /* Output: (read x => y as x is the post-dominator for y (all paths from x to the exit must go through y)) "bb4" => "bb4", "bb1" => "bb4", "bb2" => "bb1", "bb3" => "bb2", "bb0" => "bb2", */ ``` However, `findBlocksWithBackEdges` prevented us from adding `bb1` to the `unconditionalBlocks` set as `bb2` (its post dominator) has a back edge. I'm not sure what the `findBlocksWithBackEdges` was doing previously, so I replaced it with an invariant asserting that the loop terminates.