Should be `TypeError` not `KeyError` (cf.: `range(5)[3.5]`)

I don't know the pandas codebase well enough to really judge most of this patch, but I do worry that this is kind of a hackish solution incurs technical debt. There are plenty of other types besides `float` that provide `int`, are not subclasses of `float`, and that are still not valid indices (e.g., `np.float32`). Wouldn't it be better to find whatever code is responsible for doing the integer-based indexing and checking for `__index__` there?