Add `as_frame` to `sklearn.datasets.fetch_20newsgroups`

### Describe the workflow you want to enable

I would like to load the 20 newsgroups dataset as a dataframe in one line of code:
```
X, y = sklearn.datasets.fetch_20newsgroups(return_X_y=True, as_frame=True)
```

### Describe your proposed solution

Add the argument `as_frame` to `sklearn.datasets.fetch_20newsgroups` to make the function behave similar to other data loading functions such as [`fetch_openml`](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_openml.html) or [`fetch_covtype`](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_covtype.html#sklearn.datasets.fetch_covtype).

### Describe alternatives you've considered, if relevant

Manually casting to a dataframe:
```
In [11]: X, y = sklearn.datasets.fetch_20newsgroups(return_X_y=True)                                                                                                                                         

In [12]: type(X)                                                                                                                                                                                             
Out[12]: list

In [15]: import pandas as pd                                                                                                                                                                                 

In [19]: pd.DataFrame(X, dtype='str')                                                                                                                                                                        
Out[19]: 
                                                       0
0      From: lerxst@wam.umd.edu (where's my thing)\nS...
1      From: guykuo@carson.u.washington.edu (Guy Kuo)...
2      From: twillis@ec.ecn.purdue.edu (Thomas E Will...
3      From: jgreen@amber (Joe Green)\nSubject: Re: W...
4      From: jcm@head-cfa.harvard.edu (Jonathan McDow...
...                                                  ...
11309  From: jim.zisfein@factory.com (Jim Zisfein) \n...
11310  From: ebodin@pearl.tufts.edu\nSubject: Screen ...
11311  From: westes@netcom.com (Will Estes)\nSubject:...
11312  From: steve@hcrlgw (Steven Collins)\nSubject: ...
11313  From: gunning@cco.caltech.edu (Kevin J. Gunnin...

[11314 rows x 1 columns]

```

### Additional context

The [string dtype](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.StringDtype.html#pandas.StringDtype) has been added in version 1.0 and the [minimal version for pandas in sklearn 1.1 will be 1.0.5](https://scikit-learn.org/dev/install.html#installing-the-latest-release) so I believe this should be possible to add.

CC @louquinze

COMMENT:
> in which the 20 newsgroups dataset is now treated the same way

The 20 newgroups dataset already stands out because it is a list of strings, while most of the other `sklearn.datasets` returns a 2d ndarray by default. 

Assuming https://github.com/scikit-learn/scikit-learn/pull/16994 gets merged, then it possible to return a `DataFrame`. If the PR not merged, we would need to return a Series so that the snippet you provided works.

For me, I would prefer a DataFrame, but that requires #16994 to be merged first.

Labels: New Feature, module:datasets, Pandas compatibility