ENH: allow categoricals in msgpack
Supercedes #12191.

I've made a best-effort to rebase this against master.

It seems to work here.

- add a note in whatsnew/0.18.1
 > add a note in whatsnew/0.18.1

Done. Please let me know if it is to taste.
 ok #12574  has been merged. pls rebase/update.
 Rebased.
 Wow, I think I managed to clear all of your comments. Everything suddenly made sense in the end. Please let me know if I missed something and if I should squash or reword my commits.
 I broke the NDFrame tests. Investigating.
 @pwaller can you rebase/update
 this looks pretty good code wise. can you squash everything. 
 cc @kawochen 
 Squashed.
 Rebased and comments addressed.
 I'm getting a test failure I'm not sure how to address and I don't have much time to look into it:

```
======================================================================
ERROR: test_basic_frame (pandas.io.tests.test_packers.TestNDFrame)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/travis/build/pydata/pandas/pandas/io/tests/test_packers.py", line 410, in test_basic_frame
    i_rec = self.encode_decode(i)
  File "/home/travis/build/pydata/pandas/pandas/io/tests/test_packers.py", line 75, in encode_decode
    return read_msgpack(p, **kwargs)
  File "/home/travis/build/pydata/pandas/pandas/io/packers.py", line 203, in read_msgpack
    return read(fh)
  File "/home/travis/build/pydata/pandas/pandas/io/packers.py", line 188, in read
    l = list(unpack(fh, encoding=encoding, **kwargs))
  File "_unpacker.pyx", line 459, in pandas.msgpack._unpacker.Unpacker.__next__ (pandas/msgpack/_unpacker.cpp:4709)
  File "_unpacker.pyx", line 390, in pandas.msgpack._unpacker.Unpacker._unpack (pandas/msgpack/_unpacker.cpp:3843)
  File "/home/travis/build/pydata/pandas/pandas/io/packers.py", line 639, in decode
    blocks = [create_block(b) for b in obj[u'blocks']]
  File "/home/travis/build/pydata/pandas/pandas/io/packers.py", line 637, in create_block
    dtype=b[u'dtype'])
  File "/home/travis/build/pydata/pandas/pandas/core/internals.py", line 2518, in make_block
    return klass(values, ndim=ndim, fastpath=fastpath, placement=placement)
  File "/home/travis/build/pydata/pandas/pandas/core/internals.py", line 1903, in __init__
    placement=placement, **kwargs)
  File "/home/travis/build/pydata/pandas/pandas/core/internals.py", line 1314, in __init__
    raise TypeError("values must be {0}".format(self._holder.__name__))
TypeError: values must be Categorical
```
 Updated again. Thanks for your patience.
 To fix that error

```
diff --git a/pandas/io/packers.py b/pandas/io/packers.py
index ba38c8e..f009793 100644
--- a/pandas/io/packers.py
+++ b/pandas/io/packers.py
@@ -266,7 +266,7 @@ def convert(values):

     # convert object
     if is_categorical_dtype(values):
-        return v
+        return values

     if dtype == np.object_:
         return v.tolist()
```
 Forced again.
 ok looks good. ping when green.
 thanks!
