BUG: Index.where casting ints to str
- [ ] closes #xxxx
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

Two things going on here (can separate if asked, but they got mixed together in the process).

1) don't re-raise in `DatetimeLikeIndexMixin.where`, so we end up giving the more standard exception message.
2) Use validate_fill_value in Index.where, and have that disallow strs for numeric.  This fixes the following in master:

```
>>> idx = pd.Index(range(3))
>>> mask = np.array([True, False, True])
>>> 
>>> idx.where(mask, "2")
Index(['0', '2', '2'], dtype='object')
```

@pganssle I'm seeing this in the logs for many of the windows py38 builds:

```
Exception ignored in: 'pandas._libs.tslibs.tzconversion._tzlocal_get_offset_components'
Traceback (most recent call last):
  File "C:\Miniconda\envs\pandas-dev\lib\site-packages\dateutil\tz\_common.py", line 144, in fromutc
    return f(self, dt)
  File "C:\Miniconda\envs\pandas-dev\lib\site-packages\dateutil\tz\_common.py", line 261, in fromutc
    _fold = self._fold_status(dt, dt_wall)
  File "C:\Miniconda\envs\pandas-dev\lib\site-packages\dateutil\tz\_common.py", line 196, in _fold_status
    if self.is_ambiguous(dt_wall):
  File "C:\Miniconda\envs\pandas-dev\lib\site-packages\dateutil\tz\tz.py", line 254, in is_ambiguous
    naive_dst = self._naive_is_dst(dt)
  File "C:\Miniconda\envs\pandas-dev\lib\site-packages\dateutil\tz\tz.py", line 260, in _naive_is_dst
    return time.localtime(timestamp + time.timezone).tm_isdst
OSError: [Errno 22] Invalid argument
```

Any idea why _naive_is_dst would throw an OSError? @jbrockmendel Yes, that will happen any time the timestamp is negative or close to negative (i.e. pre-1970), because at the OS level Windows doesn't support negative timestamps. It's documented in [`fromtimestamp`](https://docs.python.org/3/library/datetime.html#datetime.date.fromtimestamp).

There's a [bug here](https://bugs.python.org/issue36439), and we're hoping in CPython that eventually we can write our own timestamp conversion logic that has consistent behavior cross-platform, but it's particularly tough when it involves interacting with locales and whatnot. this maybe an outstanding issue (of course finding it might be non-trivial)