is_categorical_dtype depends on boolness of the object passed.
```python
In [76]: from pandas.core.dtypes.common import is_categorical_dtype

In [77]: class Foo(object):
    ...:     def __bool__(self):
    ...:         raise NotImplementedError("Foo doesn't support boolness")
    ...:
    ...:     def __eq__(self, other):
    ...:         return Foo()

In [78]: is_categorical(Foo())
NotImplementedError                       Traceback (most recent call last)
<ipython-input-78-e619c3f62c63> in <module>
----> 1 is_categorical(Foo())

/usr/python3.7/site-packages/pandas/core/dtypes/common.py in is_categorical(arr)
    289     """
    290
--> 291     return isinstance(arr, ABCCategorical) or is_categorical_dtype(arr)
    292
    293

/usr/python3.7/site-packages/pandas/core/dtypes/common.py in is_categorical_dtype(arr_or_dtype)
    600     if arr_or_dtype is None:
    601         return False
--> 602     return CategoricalDtype.is_dtype(arr_or_dtype)
    603
    604

/usr/python3.7/site-packages/pandas/core/dtypes/base.py in is_dtype(cls, dtype)
    110             return True
    111         try:
--> 112             return cls.construct_from_string(dtype) is not None
    113         except TypeError:
    114             return False

/usr/python3.7/site-packages/pandas/core/dtypes/dtypes.py in construct_from_string(cls, string)
    456         it's not possible """
    457         try:
--> 458             if string == 'category':
    459                 return cls()
    460             else:

<ipython-input-77-645d89edd55f> in __bool__(self)
      1 class Foo(object):
      2     def __bool__(self):
----> 3         raise NotImplementedError("Foo doesn't support boolness")
      4
      5     def __eq__(self, other):

NotImplementedError: Foo doesn't support boolness
```
#### Problem description
is_categorical breaks if \_\_boo\_\_ of an object returns another (or same) object for which \_\_bool\_\_ raises an exception. We return the an object of **Foo** itself in the reproducer above to demonstrate this behavior. This affects `pandas.to_datetime` and probably other functionalities as well.

I guess converting an object to datetime should not depend on it's bool'ness.

#### Expected Output
True or False

#### Output of ``pd.show_versions()``
In [79]: pandas.show_versions()
<details>
INSTALLED VERSIONS
------------------
commit: None
python: 3.7.3.final.0
python-bits: 64
OS: Linux
OS-release: 3.10.0-957.saim.x86_64
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

pandas: 0.24.2
pytest: 4.4.0
pip: 10.0.1
setuptools: 39.0.1
Cython: 0.29.5
numpy: 1.14.3
scipy: 1.1.0
pyarrow: None
xarray: None
IPython: 7.3.0
sphinx: 2.0.0
patsy: 0.5.1
dateutil: 2.8.0
pytz: 2017.3
blosc: 1.8.1
bottleneck: None
tables: 3.4.4
numexpr: 2.6.9
feather: None
matplotlib: 2.2.3
openpyxl: 2.6.2
xlrd: 1.2.0
xlwt: 1.3.0
xlsxwriter: 1.1.5
lxml.etree: 3.6.0
bs4: 4.7.1
html5lib: 1.0.1
sqlalchemy: 1.2.5+4.saim
pymysql: None
psycopg2: 2.7.7 (dt dec pq3 ext)
jinja2: 2.10
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: None
gcsfs: None
</details>