NB: Since we are using the same InferCtxt in each iteration, we essentially *spoil* the inference variables and we only ever get at most *one* applicable candidate (only the 1st candidate has clean variables that can still unify correctly).
For high-level intro to how type checking works in rustc, see the type checking chapter of the rustc dev guide.