ENH: Group names in a groupby should be `namedtuple` instead of `tuple`
#### Is your feature request related to a problem?

The columns in a DataFrame have names. When you iterate over a groupby object and get the names of the groups (which correspond to values in the original DataFrame), the group names are returned as ordinary `tuple`s and so their correspondence to the columns of the DataFrame is lost. Fields in the `name` tuple can only be accessed by their index; the more natural option of using the corresponding column name in the original DataFrame is not possible.

#### Describe the solution you'd like

When iterating over a groupby -- `for name, group in df.groupby(...):` -- `name` should be a `namedtuple` instead of an ordinary `tuple` so as to allow accessing fields by column name. Any other function that returns the name of a group should return it as a `namedtuple` and not a tuple. The ordinary considerations about what happens when an invalid Python identifier is used as a `namedtuple` field should occur (I think they get replaced with `_1`, `_2`, etc, but not sure about this), especially when the columns have names that are not strings.

#### API breaking implications

As far as I know, `namedtuple`s expose a strict superset of the API of `tuple`s, so there shouldn't be any breaking changes.

#### Describe alternatives you've considered

This very ugly solution:

    grouping_cols = ["col1", "col2"]
    g = df.groupby(grouping_cols)
    name, _ = next(iter(g))
    name_col1 = name[grouping_cols.index("col1")]
    # now name_col1 is the value in the `name` tuple corresponding to the `"col1"` column

#### Additional context

Ideally I could simply write `name.col1`.