PERF: lazify IO imports
- [ ] closes #xxxx (Replace xxxx with the GitHub issue number)
- [ ] [Tests added and passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#writing-tests) if fixing a bug or adding a new feature
- [ ] All [code checks passed](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit).
- [ ] Added [type annotations](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#type-hints) to new arguments/methods/functions.
- [ ] Added an entry in the latest `doc/source/whatsnew/vX.X.X.rst` file if fixing a bug or adding a new feature.

generally in favour - do you have an estimate of how much this helps? >  do you have an estimate of how much this helps?

The measurements with `python -X importtime -c "import pandas as pd"` are extremely noisy.  I eyeball it at roughly 511ms in main 472ms in this branch.

The next big chunk available would be to delay core.groupby import, which is 86ms.  Doing that requires some yak-shaving bc core.window imports it, so that needs to be made lazy (and docstrings moved xref #51823).  Also dask references pd.core.groupby.groupby.something_i_forget_what at import-time to do a docstring pinning, so we'd need to do something about that.

Following that is some smaller-but-easier stuff: stdlib imports like shutil and stuff in pd.compat.compressors that are relatively expensive, dateutil (xref #52659).

The big ones are pyarrow (87ms) and numpy (86ms).  making numpy import lazy is probably not worth the effort (though asking numpy to lazify parts of its own imports might be worthwhile).  I'd like to see the pyarrow import made lazy, especially if we don't make it required. No clear interest here, closing.