Fix missing tick labels on twinned axes.
## Background:

Multi-row and/or multi-column subplots can utilize shared axes.

An external share happens at axis creation when a sharex or sharey
parameter is specified.

An internal share, or twinning, occurs when an overlayed axis is created
by the `Axes.twinx()` or `Axes.twiny()` calls.

The two types of sharing can be distinguished after the fact in the
following manner. If two axes sharing an axis also have the same
position, they are internally sharing an axis, they are twinned. If their positions are different, they are externally sharing the common axis.

For externally shared axes Pandas automatically removes tick labels for
all but the last row and/or first column in
`./pandas/plotting/_matplotlib/tools.py`'s function `_handle_shared_axes()`.

## The problem:

`_handle_shared_axes()` should be interested in externally shared axes,
whether or not they are also twinned. It should, but **does not**, ignore
axes which are only twinned. 

Which means that twinned-only axes wrongly lose their tick labels.

## The cure:

This commit introduces `_ignore_colocated_axes()` which ignores any
axes in a list which have the same position as the given axis. It uses
this function to envelope calls from `_handle_shared_axes()` to
`Axes.get_shared_{x,y}_axes().get_siblings(ax)`.

## The demonstration test case:

Note especially the axis labels (and associated tick labels).

```python
#!/usr/bin/python3

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Create data
df = pd.DataFrame({'a': np.random.randn(1000),
                   'b': np.random.randn(1000)})

# Create figure
fig = plt.figure()
plots = fig.subplots(2, 3)

# Create *externally* shared axes
plots[0][0] = plt.subplot(231, sharex=plots[1][0])
plots[0][2] = plt.subplot(233, sharex=plots[1][2])

# Create *internally* shared axes
twin_ax1 = plots[0][1].twinx()
twin_ax2 = plots[0][2].twinx()

# Plot data to primary axes
df['a'].plot(ax=plots[0][0], title="External share only").set_xlabel("this label should never be visible")
df['a'].plot(ax=plots[1][0])

df['a'].plot(ax=plots[0][1], title="Internal share (twin) only").set_xlabel("this label should always be visible")
df['a'].plot(ax=plots[1][1])

df['a'].plot(ax=plots[0][2], title="Both").set_xlabel("this label should never be visible")
df['a'].plot(ax=plots[1][2])

# Plot data to twinned axes
df['b'].plot(ax=twin_ax1, color='green')
df['b'].plot(ax=twin_ax2, color='yellow')

# Do it
plt.show()
```
---

- [ ] closes #27812
- [ ] tests added / passed
- [ ] passes `black pandas`
- [ ] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
