BUG: boxplot returns incorrect dict

#7096 returns incorrect `dict` when number of columns and subplots are different.

```
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pandas.util.testing as tm


n=100
gender = tm.choice(['Male', 'Female'], size=n)
classroom = tm.choice(['A', 'B', 'C'], size=n)

df = pd.DataFrame({'gender': gender,
                          'classroom': classroom,
                          'height': np.random.normal(66, 4, size=n),
                          'weight': np.random.normal(161, 32, size=n),
                          'category': np.random.randint(4, size=n)})

df.boxplot(by='classroom', return_type='axes')
# {'category': array([<matplotlib.axes.AxesSubplot object at 0x104700e90>,
#        <matplotlib.axes.AxesSubplot object at 0x10671ca90>], dtype=object),
#  'height': array([<matplotlib.axes.AxesSubplot object at 0x106744dd0>,
#        <matplotlib.axes.AxesSubplot object at 0x106766b50>], dtype=object)}

# This must be a dict with 3 keys ('category', 'height' and 'weight') which value is AxesSubplot (not numpy.array).
```

Also, `boxplot` sometimes return `OrderedDict` and sometimes `dict` inconsistently.
```
df.boxplot(by='classroom', return_type='dict')
# OrderedDict([('category', {'medians': [<matplotlib.lines.Line2D object at 0x106fe8c10>,
# ...
```
The fix makes `boxplot` to always return `OrderedDict` which has correct mapping of keys and values