Subclassed reshape clean
State: closed

 - [x] closes #15563 
 - [x] tests added / passed
 - [x] passes ``git diff upstream/master | flake8 --diff``
 - [x] whatsnew entry

This PR enables reshape operations on subclassed `DataFrame` and `Series` objects to preserve subclass families through the use of `_constructor*` properties.

See discussion on PR #15564. Thanks for the help @jreback.

This PR has a cleaner implementation of subclassed unstack operations by modifying the `_Unstacker` initializer to allow an optional `constructor` argument.

Additionally, this PR implements tests for a wider set of reshape operations. It now covers:

* `DataFrame.stack()`, `DataFrame.unstack()`, `DataFrame.pivot()`, and `series.unstack()` for containers with `Index` and `MultiIndex` indices and/or columns
* `pd.melt()`
* `pd.wide_to_long()`

Finally, the pandas internals docs have been edited for clarity and additional examples have been added to showcase subclassed reshape and math operations.

Labels:
name: Reshaping
description: Concat, Merge/Join, Stack/Unstack, Explode
name: API Design

Comments:
Oops just saw #13563/#15601. Want me to remove SubclassedPanel from the subclassing docs or is that something for another PR once panels are officially on their way out?
yeah don't add anything about panel 
I left the `Panel` column in the default `_constructor*` property table but removed references to panels from the examples
# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=h1) Report
> Merging [#15655](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/0ea0f25bfb920cd0f58872dc95913a7aa9c0c3da?src=pr&el=desc) will **increase** coverage by `0.63%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/15655/graphs/tree.svg?height=150&width=650&token=eZ4WkYLtcO&src=pr)](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master   #15655      +/-   ##
==========================================
+ Coverage   90.38%   91.01%   +0.63%     
==========================================
  Files         161      143      -18     
  Lines       50916    49383    -1533     
==========================================
- Hits        46019    44947    -1072     
+ Misses       4897     4436     -461
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `?` | |
| #single | `?` | |

| [Impacted Files](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pandas/core/reshape.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvcmVzaGFwZS5weQ==) | `99.27% <100%> (ø)` | |
| [pandas/io/gbq.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL2lvL2dicS5weQ==) | `25% <0%> (-58.34%)` | :arrow_down: |
| [pandas/tools/plotting.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL3Rvb2xzL3Bsb3R0aW5nLnB5) | `71.79% <0%> (-10.03%)` | :arrow_down: |
| [pandas/util/\_tester.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL3V0aWwvX3Rlc3Rlci5weQ==) | `35.29% <0%> (-3.6%)` | :arrow_down: |
| [pandas/types/concat.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL3R5cGVzL2NvbmNhdC5weQ==) | `98.06% <0%> (-1.94%)` | :arrow_down: |
| [pandas/conftest.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL2NvbmZ0ZXN0LnB5) | `94.11% <0%> (-1.72%)` | :arrow_down: |
| [pandas/compat/pickle\_compat.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL2NvbXBhdC9waWNrbGVfY29tcGF0LnB5) | `68.29% <0%> (-1.22%)` | :arrow_down: |
| [pandas/tools/hashing.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL3Rvb2xzL2hhc2hpbmcucHk=) | `99.02% <0%> (-0.98%)` | :arrow_down: |
| [pandas/io/packers.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL2lvL3BhY2tlcnMucHk=) | `87.57% <0%> (-0.94%)` | :arrow_down: |
| [pandas/core/base.py](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvYmFzZS5weQ==) | `95.51% <0%> (-0.67%)` | :arrow_down: |
| ... and [189 more](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=tree-more) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=footer). Last update [0ea0f25...dc3b07e](https://codecov.io/gh/pandas-dev/pandas/pull/15655?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

Any thoughts as to why coverage would have decreased when the diff was 100% covered and I only added (didn't modify) tests? I don't like all that red.
can you rebase / update
Will do. I was traveling for the last few weeks but I'll update this when I find a bit of time. Thanks!
needs a rebase / update. pls comment if you would like to continue.