Avoid O(n^2) performance by reconsidering the full set of obligations
only when we are about to report an error (#18208). I found it is
still important to consider the full set in order to make tests
like `let x: Vec<_> = obligations.iter().collect()` work.