API: deprecate setting of .ordered directly (GH9347, GH9190)
closes #9347
closes #9190
closes #9148 

so this is option 4).

Default is now `ordered=False` (independently of whether you specify categories or not)
The ordering is still what factorize does (seen order, if no categories are specified).

Add `set_ordered` to change the `ordered` flag, which by default returns a new object.

```
In [1]: cat = pd.Categorical([0,1,2])
In [2]: cat
Out[2]: 
[0, 1, 2]
Categories (3, int64): [0, 1, 2]

In [3]: cat.ordered
Out[3]: False

In [4]: cat.ordered=True
pandas/core/categorical.py:452: FutureWarning: Setting 'ordered' directly is deprecated, use 'set_ordered'

In [5]: cat = cat.set_ordered(True)

In [6]: cat
Out[6]: 
[0, 1, 2]
Categories (3, int64): [0 < 1 < 2]

In [7]: cat.ordered
Out[7]: True

In [8]: cat = pd.Categorical([0,1,2],ordered=True)

In [9]: cat
Out[9]: 
[0, 1, 2]
Categories (3, int64): [0 < 1 < 2]

In [12]: cat.ordered
Out[12]: True
```

Further added the ability for astype to pass on keywords to the constructor

```
In [1]: Series(["a","b","c","a"]).astype('category',ordered=True)
Out[1]: 
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a < b < c]

In [2]: Series(["a","b","c","a"]).astype('category',categories=list('abcdef'),ordered=False)
Out[2]: 
0    a
1    b
2    c
3    a
dtype: category
Categories (6, object): [a, b, c, d, e, f]
```

Furthermore I put a warning as seemingly simple operations will fail because the user had an _implicity_ ordered Categorical.

```
In [1]: df = DataFrame({ 'A' : Series(list('aabc')).astype('category'), 'B' : np.arange(4) })

In [2]: df['A'].order()
TypeError: Categorical not ordered
you can use .set_ordered(True) to change the Categorical to an ordered one

In [3]: df.groupby('A').sum()
ValueError: cannot sort by an unordered Categorical in the grouper
you can set sort=False in the groupby expression or
make the categorical ordered by using .set_ordered(True)
```
