ENH: add PrintOptions context manager to numpy.core.

Instantiating ``PrintOptions`` returns an object that is both:
* a context manager for setting printing options, and
* a Mapping exposing the current printing options.

Instead of using a ``PrintOptions`` object as a context manager, the
``apply`` method can be called, which will apply the options
specified in the constructor.  If the formatter printing option is not
specified, it is reset.

Printing options determine the way floating point numbers, arrays
and other NumPy objects are displayed.