PERF: remove use of Python sets for interpolate
have been investigating avoiding internals for interpolation. xref #34628


This PR address the issue of using Python sets, which is responsible for the bulk of the time in our current asv.

There are other improvements (will raise other PRs), but would need new benchmarks to show a benefit such as different index types and unsorted indexes. so this PR is targeting our current benchmark first.

prelim results (will post asv results if tests pass)
```
N = 10000
# this is the worst case, where every column has NaNs.
df = pd.DataFrame(np.random.randn(N, 100))
df.values[::2] = np.nan
df
%timeit df.interpolate()
# 189 ms ± 24.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)  <-- master
# 65.1 ms ± 635 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)  <-- PR
```
