[core] new mechanism for handling defaults in pyMOR

This commit introduces the new pymor.core.defaults module, replacing the
old pymor.defaults module.

The new defaults handling mechanism works as follows: From now on, each
default in pyMOR is associated to a keyword argument (with default value) of
some function:

from pymor.core.defaults import defaults

@default('tol')
def fancy_algorithm(x, y, tol=1e-10):
    return x + y + tol

If fancy_algorithm is contained in package.module, a new user-modifiable
default 'package.module.fancy_algorithm.tol' with value '1e-10' is added
to pyMOR's global default registry (pymor.core.defaults._default_container).

fancy_algorithm will behave as follows:

fancy_algorithm(0, 0) == 1e-10
fancy_algorithm(0, 0, None) == 1e-10
fancy_algorithm(0, 0, 42) == 42

The special behaviour for 'None' allows the following design pattern:

def solve_something(x, tol_for_fancy_algorithm=None):
   ...
   r = fancy_algorithm(x, x, tol=tol_for_fancy_algorithm)
   ...

Defaults can be viewed and modified using the print_defaults,
set_defaults, load_defaults_from_file and write_defaults_to_file
methods. Defaults are auto-loaded from a pymor_defaults.py in your
current working directory. (You can also define the PYMOR_DEFAULTS
environment variable.)

The set of all default values should be considered to be the only global
state there is in pyMOR which affects computations. The state of the
default values is now included in every state id which is calculated.
The result of any (mathematically relevant) method call on an immutable
object is therefore fully determined by the following data:

  the state id of the object, the arguments to the function call,
  the current state of the global defaults

(As immutable objects are not completely immutable in pyMOR, see, e.g.,
pymor.operators.basic.NumpyMatrixBasedOperator, this is actually only a
very strong convention.)

For further details, see the documentation of pymor.core.defaults.

This commit also updates pyMOR to use the new defaults mechanism. This
leads to the following minor changes:

- The default log levels is now also a default associated to the new
  pymor.core.logger.set_log_levels method.
- A default random seed is attached to the new
  pymor.tools.random.new_random_state method, which creates a new
  numpy.random.RandomState. Each method in pyMOR using random numbers
  should from now on always operate on either a user-provided random
  state or a random state created via this method. (This eliminates
  the states of the Python and NumPy random generators from the relevant
  global state.) See pymor.parameters.spaces.CubicParameterSpace.sample_randomly
  for an example.
- Addition of pymor.tools.pprint containing 'format_array' which is used
  by Parameter.__str__
- New behaviour of float_cmp: atol is no longer set to rtol if atol is
  None. Both atol and rtol are now pyMOR defaults.
- pymor.la.numpysolvers now contains all the code involved with linear
  solvers for NumPy matrices.