Infer names in MultiIndex.from_product
- [x] closes #27292
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

@TomAugspurger in regards to your first comment, the reason I opened an issue about this in the first place was due to the addition of `from_frame`, which *does* infer names from the Series inputs, so it seemed like an inconsistency.   If that behavior usually isn't wanted/needed in `from_product`, then maybe this PR isn't necessary. you would *also* have to change ``from_arrays`` for the same reason. I think if you did that would be ok with this (ex using @TomAugspurger suggestion, that an explicit ``names=None`` works) @christopherzimmerman do you have time to make `names=None` mean "no names for any levels"?

The default value will be something like

```
_no_default = object()

def from_product(self, ..., names=_no_default, ...):
    if names is None or names is _no_default:
        names = [None] * nlevels

``` @TomAugspurger  sorry for the inactivity, I'll make those changes.  I believe I messed up the commit history for this PR when I rebased from master (which is resulting in a check failing), and have a lot of junk commits included, I may close this PR and open another one.