Improve the NullCheckElimination pass

Teach the NullCheckElimination pass about recurrences involving inbounds
GEPs. This allows the pass to optimize null checks from most uses of
single slice and vector iterators.

This still isn't sufficient to eliminate null checks from uses of
multiple iterators with zip().

I also had my editor set to convert 8 spaces to a tab from a previous
project, so I'm undoing that here.
I don't actually rely on this assumption in the `if (isZeroConstant(Op1)) {` line. There `Op0` is a nonnull-or-poison value, and Op1 might be null in the comparison `Op1 <cmp> Op2`, but there is no question of whether `Op0` might be a zero constant regardless of canonicalization, since it's a known nonnull-or-poison value.