API: Index.str follow-ups (extract/get_dummies)
Follow-ups for #9667. Noticed 2 methods which can return `DataFrame`.
### 1. `Index.str.extract`

As shown in docstring, it returns `DataFrame` when the expression has 2 or more groups.

```
pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\d)')
#0      1
#1      2
#2    NaN
# dtype: object

pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\d)')
#      0    1
#0    a    1
#1    b    2
#2  NaN  NaN
```

Currently, `Index.str.extract` raises an error in both cases. I think 1st case should return `Index`, and 2nd case should raise understandable error.

```
pd.Index(['a1', 'b2', 'c3']).str.extract('[ab](\d)')
# AttributeError: 'Index' object has no attribute 'index'

pd.Index(['a1', 'b2', 'c3']).str.extract('([ab])(\d)')
# AttributeError: 'Index' object has no attribute 'empty'
```
### 2. `Index.str.get_dummies`

Because it returns `DataFrame`, should raise an understandable error.

```
pd.Index(['a1', 'b2', 'c3']).str.get_dummies()
# AttributeError: 'Index' object has no attribute 'fillna'
```

CC: @mortada 
