ENH: Add FrozenList and FrozenNDArray types

ENH: Add a FrozenList type to core/common + tests

ENH: Add FrozenNDArray and refactor FrozenList

* `make_immutable` class factory that creates an intermediate class
  that replaces all the mutable methods on the parent class with functions
  that raise TypeErrors
* `FrozenNDArray` - thin wrapper around ndarray that disallows setting methods
  (will be used for levels on `MultiIndex`)
TST: Additional test cases for immutable containers
ENH: Use FrozenList for levels, labels in index
ENH: Add FrozenNDArray class
Remove FrozenNDArray and FrozenList from common
CLN: Move Frozen* tests to tests/test_base
fixups to FrozenList/FrozenNDArray
Fixup: Add __unicode__ method to FrozenList
CLN: Change labels and levels to be mostly immutable.

Labels are now converted to `FrozenNDArray` and wrapped in a
`FrozenList`. Should mostly resolve #3714 because you have to work to
actually make assignments to an `Index`.
TST: Fix test_mixed_panel to reflect true name behavior
ENH: Deprecate direct setting of names, levels and labels

Un-deprecate names

fixup to _deprecate_setter (still need to add tests

Change _deprecate_setter to be clearer
CLN: Use set_names instead of mutation.

CLN: core/generic - use set_names instead of names attribute

CLN: io/parsers - use set_names instead of mutation

CLN: Make tools/pivot use immutable set_names
CLN: MultiIndex should use setter method too
BUG: Give MultiIndex its own astype method

fixup to astype

various test fixups (prob just combineme)

Fixes issue with set_value forgetting names.
ENH: Allow Index.copy() to take keyword arguments

Index derivatives can set `name` or `names` as well as
`dtype` on copy. MultiIndex can set `levels`, `labels`, and `names`.
ENH: Have index inherit from FrozenNDArray
TST: Make drop names test better.
TST: deepcopy now actually makes a copy
fixup - change to index needs to be inplace
CLN: core/index.py style fixes