FIX: Implement small Categorical fixups

This is a squashed commit which adresses several small issues
identified in the latest code review.

* As per dicussion in https://github.com/pydata/pandas/issues/8074,
  Categorical.unique() should return an array and not a Index object
  to make is consistant with other unique() implementations.

* Mark a few more categorical methods as internal

* Change reorder_levels and drop_unused_levels to inplace=False. As per
  the discussion in #8074, change the default of both methods
  to return a copy and only do the change inplace if told otherwise.

  Discusion in
  https://github.com/pydata/pandas/issues/8074#issuecomment-54093664

* Make str(cat) more array like. As Categorical is more like
  np.ndarray and less similar to pd.Series, change the string
  representation of Categorical to be more like np.ndarray.

  The new str(cat) will only show at max 10 values.

  Also remove the "Categorical(" in front of an empty categorical
  -> either that's put in front of every str(cta) or none. It also missed
  the final ")".

* Test more nan handling in Categorical

* Add a testcase for groupby with two columns and unused categories

  During the devleopment of pandas new Categorical support, groupby
  with two columns (one worked) didn't include empty categories which
  omits rows with NaN. Add a testcase so this is checked.

  No codechanges nessesary, this bug was fixed at some other places
  before. See #8138 for more details.
API: remove compat keyword in Categorical constructor

Before the new Categorical work, the default two argument constructor
was expecting "codes and levels" but this was changed to
"values and levels" and a 'compat' kwarg was added, which could
be used to switch to the old style constructor useage.

It was decided that we switch to the new style constructor useage as
the new default (compat=False) and implement a 'from_codes(...)'
constructor.

As the compat codepath is now never triggered and code should be
changed to use the new 'from_codes()' constructor, remove the old
codepath.

Add some warnings if we are pretty sure that the old style
constructor is meant, but unfortunately we don't catch all cases.
API: Implement Series.cat.codes and rename the proxy class

* Series should also expose Series.cat.codes as a Series of codes.
  See discussion in
  https://github.com/pydata/pandas/issues/8074#issuecomment-53992337

* Rename CategoricalProperties CategoricalAccessor. It has more
  than properties, so "accessor" is more appropiate.
API: rename Categorical.levels to .categories

The name 'levels' was already used by a much different concept in
MultiIndex and this was too confusing, so change the name to
'categories'. Add deprecation warning if the old name is used
(in constructor or the public 'levels' attribute). The old name
'levels' is not anymore exposed unter Series.cat as it was never
part of a stable release.

See the discussion in https://github.com/pydata/pandas/issues/8074

This rename was done by search&replace in categorical.py and the
corresponding tests_categorical.py, implementing the deprecation
accessor (with a temporary 'raise Exception') and then run the the
unittests and change code until all tests pass.
ENH: Introduce methods for each change to Categorical.categories

There are multiple "actions" which can be done to categories:

- add one or more categories
- remove one or more categories
- rename the categories
- reorder the categories
- remove unused categories

Each of these actions now gets it's own method together with a special
`set_categories`, which can do more than one action in one call, which is
needed to save computation time.

See https://github.com/pydata/pandas/pull/8153#issuecomment-54356611 and the
following comments.
DOC: update to reflect changes in Categorical

* rename of levels -> categories
* don't use the `Categorical` constructor if thats not needed
* introduce the new methods to manipulate categories