BUG: Fix merging non-indexes causes Index dtype promotion in when keys are missing
... from left or right side. (GH28220)
Also closes GH24897, GH24212, and GH17257

- [x] closes #28220, #24897, #24212, and #17257
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Probably requires a bit more cleanup and reduction of spaghetti... Not in love with the the solution (as it's quite similar to using both indexes) and requires extension test case changes, but hoping to get some comments and feedback on making it better.
