BUG: Raise TypeError when joining with non-DataFrame using 'on=' (GH#61434)
Closes GH#61434

### What does this PR change?

When using `DataFrame.join()` with the `on` parameter, passing an invalid object like a `dict`, `int`, or third-party DataFrame previously resulted in unclear internal errors.

This PR adds a minimal type check that raises a clear `TypeError` when `other` is not a `DataFrame`, `Series`, or a list of such objects. Valid list-based joins without `on` remain unaffected.

### Checklist

- [x] Closes #61434
- [x] Tests added and passed
- [x] All code checks passed via `pre-commit run --all-files`
- [x] Entry added in `doc/source/whatsnew/v3.0.0.rst`
All checks passed except the Pyodide build, which failed due to a rate-limit (HTTP 429). The failure seems unrelated to this PR. A rerun should resolve it This pull request is stale because it has been open for thirty days with no activity. Please [update](https://pandas.pydata.org/pandas-docs/stable/development/contributing.html#updating-your-pull-request) and respond to this comment if you're still interested in working on this. @mroeschke @rhshadrach can you please take a look at this?