ENH: Add Series method to explode a list-like column
replaces #24366 
closes #16538 
closes #10511 

Sometimes a values column is presented with list-like values on one row.
Instead we may want to split each individual value onto its own row,
keeping the same mapping to the other key columns. While it's possible
to chain together existing pandas operations (in fact that's exactly
what this implementation is) to do this, the sequence of operations
is not obvious. By contrast this is available as a built-in operation
in say Spark and is a fairly common use case

provides a nice inversion here
```
In [31]: s = pd.DataFrame({'a': pd.date_range('20190101', periods=3, tz='UTC')}).apply(lambda x: x.array, axis=1)                                                                                                                                                             

In [32]: s                                                                                                                                                                                                                                                                    
Out[32]: 
0    [2019-01-01 00:00:00+00:00]
1    [2019-01-02 00:00:00+00:00]
2    [2019-01-03 00:00:00+00:00]
dtype: object

In [33]: s.iloc[0]                                                                                                                                                                                                                                                            
Out[33]: 
<DatetimeArray>
['2019-01-01 00:00:00+00:00']
Length: 1, dtype: datetime64[ns, UTC]

In [34]: s.explode()                                                                                                                                                                                                                                                          
Out[34]: 
0   2019-01-01 00:00:00+00:00
1   2019-01-02 00:00:00+00:00
2   2019-01-03 00:00:00+00:00
dtype: datetime64[ns, UTC]
```

```
In [4]: s = pd.Series([np.arange(np.random.randint(100)) for _ in range(100000)])                                                                                                                                                                            

In [5]: s                                                                                                                                                                                                                                                    
Out[5]: 
0        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
1        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
2        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
3                                          [0, 1, 2, 3, 4]
4        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
                               ...                        
99995    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
99996    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
99997    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
99998                                         [0, 1, 2, 3]
99999    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...
Length: 100000, dtype: object

In [6]: s.explode()                                                                                                                                                                                                                                          
Out[6]: 
0         0
0         1
0         2
0         3
0         4
         ..
99999    43
99999    44
99999    45
99999    46
99999    47
Length: 4950205, dtype: object

In [7]: %timeit s.explode()                                                                                                                                                                                                                                  
584 ms ± 17.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```

Dataframe exploding
```
In [1]: df = pd.DataFrame( 
   ...:      [[11, range(5), 10], [22, range(3), 20]], columns=["A", "B", "C"] 
   ...: ).set_index("C") 
   ...: df                                                                                                                                                                                                                                                   
Out[1]: 
     A                B
C                      
10  11  (0, 1, 2, 3, 4)
20  22        (0, 1, 2)

In [2]: df.explode(['B'])                                                                                                                                                                                                                                    
Out[2]: 
     A  B
C        
10  11  0
10  11  1
10  11  2
10  11  3
10  11  4
20  22  0
20  22  1
20  22  2
```
