Refactor PredecessorValidator, more or less applying the following:
declare variables where used
redeclare instead of reuse variables
move assert to a more logical place
remove unused length variable
inline variables where senseful
split loops
extract methods
this is done in preparation for work on optimizing IR::verify. IR::verify calls PredecessorValidator. If the work of PredecessorValidator is made clearer, it will be easier to reason about where IR::verify doesn't need to be called (or where a subset of it would suffice).