HDFStore fails to store DataFrame with Categorical index, explicit columns and format='table'
#### Code Sample, a copy-pastable example if possible

```python
In [2]: cat = pd.Categorical(['A', 'B'])

In [3]: pd.DataFrame(index=cat).to_hdf('/tmp/test.hdf', 'test1', format='table')

In [4]: pd.DataFrame(index=list(cat), columns=['a', 'b']).to_hdf('/tmp/test.hdf', 'test2', format='table')

In [5]: pd.DataFrame(index=cat, columns=['a', 'b']).to_hdf('/tmp/test.hdf', 'test3')
/home/pietro/nobackup/repo/pandas/pandas/core/generic.py:1301: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->floating,key->block0_values] [items->['a', 'b']]

  return pytables.to_hdf(path_or_buf, key, self, **kwargs)

In [6]: pd.DataFrame(index=cat, columns=['a', 'b']).to_hdf('/tmp/test.hdf', 'test4', format='table')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-c99c98904f73> in <module>()
----> 1 pd.DataFrame(index=cat, columns=['a', 'b']).to_hdf('/tmp/test.hdf', 'test4', format='table')

/home/pietro/nobackup/repo/pandas/pandas/core/generic.py in to_hdf(self, path_or_buf, key, **kwargs)
   1299 
   1300         from pandas.io import pytables
-> 1301         return pytables.to_hdf(path_or_buf, key, self, **kwargs)
   1302 
   1303     def to_msgpack(self, path_or_buf=None, encoding='utf-8', **kwargs):

/home/pietro/nobackup/repo/pandas/pandas/io/pytables.py in to_hdf(path_or_buf, key, value, mode, complevel, complib, append, **kwargs)
    266         with HDFStore(path_or_buf, mode=mode, complevel=complevel,
    267                       complib=complib) as store:
--> 268             f(store)
    269     else:
    270         f(path_or_buf)

/home/pietro/nobackup/repo/pandas/pandas/io/pytables.py in <lambda>(store)
    260         f = lambda store: store.append(key, value, **kwargs)
    261     else:
--> 262         f = lambda store: store.put(key, value, **kwargs)
    263 
    264     path_or_buf = _stringify_path(path_or_buf)

/home/pietro/nobackup/repo/pandas/pandas/io/pytables.py in put(self, key, value, format, append, **kwargs)
    869             format = get_option("io.hdf.default_format") or 'fixed'
    870         kwargs = self._validate_format(format, kwargs)
--> 871         self._write_to_group(key, value, append=append, **kwargs)
    872 
    873     def remove(self, key, where=None, start=None, stop=None):

/home/pietro/nobackup/repo/pandas/pandas/io/pytables.py in _write_to_group(self, key, value, format, index, append, complib, encoding, **kwargs)
   1311 
   1312         # write the object
-> 1313         s.write(obj=value, append=append, complib=complib, **kwargs)
   1314 
   1315         if s.is_table and index:

/home/pietro/nobackup/repo/pandas/pandas/io/pytables.py in write(self, obj, axes, append, complib, complevel, fletcher32, min_itemsize, chunksize, expectedrows, dropna, **kwargs)
   3884 
   3885             # create the table
-> 3886             self._handle.create_table(self.group, **options)
   3887         else:
   3888             pass

/usr/lib/python3/dist-packages/tables/file.py in create_table(self, where, name, description, title, filters, expectedrows, chunkshape, byteorder, createparents, obj)
   1052                       description=description, title=title,
   1053                       filters=filters, expectedrows=expectedrows,
-> 1054                       chunkshape=chunkshape, byteorder=byteorder)
   1055 
   1056         if obj is not None:

/usr/lib/python3/dist-packages/tables/table.py in __init__(self, parentnode, name, description, title, filters, expectedrows, chunkshape, byteorder, _log)
    771         if new and isinstance(description, dict):
    772             # Dictionary case
--> 773             self.description = Description(description)
    774         elif new and (type(description) == type(IsDescription)
    775                       and issubclass(description, IsDescription)):

/usr/lib/python3/dist-packages/tables/description.py in __init__(self, classdict, nestedlvl, validate)
    526                                 'got: "%s". Please make use of the Col(), or '
    527                                 'descendant, constructor to properly '
--> 528                                 'initialize columns.' % object)
    529             object._v_pos = pos  # Set the position of this object
    530             object._v_parent = self  # The parent description

TypeError: Passing an incorrect value to a table column. Expected a Col (or subclass) instance and got: "ObjectAtom()". Please make use of the Col(), or descendant, constructor to properly initialize columns.

```
#### Problem description

The error is the same as #8603 , but given the specific circumstances under which it occurs it seems to reflect a different problem - I might be wrong though.

#### Expected Output
Like ``In [5]:`` but in 'table' format.

#### Output of ``pd.show_versions()``

<details>

INSTALLED VERSIONS
------------------
commit: None
python: 3.5.3.final.0
python-bits: 64
OS: Linux
OS-release: 4.7.0-1-amd64
machine: x86_64
processor: 
byteorder: little
LC_ALL: None
LANG: it_IT.utf8
LOCALE: it_IT.UTF-8

pandas: 0.20.0rc1+7.gf8b25c282
pytest: 3.0.6
pip: 9.0.1
setuptools: 33.1.1
Cython: 0.25.2
numpy: 1.12.0
scipy: 0.18.1
xarray: 0.9.1
IPython: 5.1.0.dev
sphinx: 1.4.9
patsy: 0.3.0-dev
dateutil: 2.5.3
pytz: 2016.7
blosc: None
bottleneck: 1.2.0
tables: 3.3.0
numexpr: 2.6.1
feather: 0.3.1
matplotlib: 2.0.0
openpyxl: 2.3.0
xlrd: 1.0.0
xlwt: 1.1.2
xlsxwriter: 0.9.6
lxml: 3.7.1
bs4: 4.5.3
html5lib: 0.999999999
sqlalchemy: 1.0.15
pymysql: None
psycopg2: None
jinja2: 2.8
s3fs: None
pandas_gbq: None
pandas_datareader: 0.2.1


</details>
