WIP/ERR: raise consistent errors for non-existent files
- [x] closes #29125
- [x] closes #13872
- [ ] closes #17918  <-- needs tests and double-checking
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

xref #29102 the json case is xfailed here.

> reinventing the wheel

If there's an existing wheel we can use, I'm all for that.

Going through the issues, I'm going to try to round up all of the "should we accept strings too?" etc issues so we can at least discuss them all at once.

Also happy to break parts of this off if anything can be identified as "easy" Closing, will re-implement in smaller pieces.