Plotting framework

Most of the new lines are from the ipython notebooks in ./examples.

This proposal for a plotting framework easily supports multiple backends (the wish that Certik expressed on multiple occasions). For the moment only matplotlib and textplot have backends (simple ones).

See the docstrings for the module and for the Plot class for details. Example usage is present in example files in the root folder.

The base idea is to have simple representation for the data to be plotted (DataSeries), simple backends implementing some or all of the api and the class Plot that is a nice and *simple* interface for all this. For anything fancy the user should access directly the backend. For example the matplotlib backend will return the figure/axe/lines instances and the user can work on them.

TODO: current issues (many thanks to asmeurer and miham for raising them):

  * https://github.com/sympy/sympy/pull/673#r395182
  * plotting matrices as 2d and 3d lines (needs `free_symbols` for matrices)
  * add `line_plot, surface_plot, contour_plot, implicit_plot, parametric_plot, list_plot, etc` if it makes sense. Or maybe `plot_*` so tab completion works.
  * saving of plots
  * plotting constants  
  * https://github.com/sympy/sympy/pull/673#issuecomment-3893813

DONE:

  * add a minimal version requirement for numpy and matplotlib (a warning? and an `if` in the unit-tests)
  * https://github.com/sympy/sympy/pull/673#issuecomment-3708447
       No more problems with array shapes.
  * https://github.com/sympy/sympy/pull/673#issuecomment-3707914 - the first issue
       Now one can plot lists of expressions.
  * https://github.com/sympy/sympy/pull/673#issuecomment-3707851
       No more problems with complex numbers or numpy.ufunc(Float(1))
  * https://github.com/sympy/sympy/pull/673#issuecomment-3707883 - the second note
       Now axis_center 'auto' is a bit smarter
  * change the number of points
  * https://github.com/sympy/sympy/pull/673#r395148
  * interactive use without `--pylab`


# NEW TODO
#1
Plot() should not do all this magic. All the magic should be in plot()
and Series().
- Plot() should accept only instances of subclasses of BaseSeries in
its constructor.
- plot() should be fixed to work after the change to Plot()
- the documentation should explicitly mention that if any heuristics
is to be added it should be contained in Series() and plot()
- the name of Series() should change to something like HeuristicSeries()

#2
Add explicit plot functions:
plot_line, plot_surface, plot_parametric_surface, etc
These again should require fully explicit syntax, no guessing like in plot()

#3
The api should be as follows (both for plot() and for the explicit
plot_something()):
- plot_some_type_of_graph(expression, tuple_of_variable_and_range, ...)
ex: plot_surface(x+y, (x, 1, 2), (y, 1, 2))
result: obvious

- plot_some_type_of_graph(list_of_expressions, tuple_of_variable_and_range, ...)
ex: plot_surface([x+y, x-y], (x, 1, 2), (y, 1, 2))
result: plots two surfaces

- plot_some_type_of_graph(many_tuples_of(expression,
tuple_of_variable_and_range, ...))
ex: plot_surface((x+y, (x, 1, 2), (y, 1, 2)), (x-y, (x, 1, 2), (y, 1, 2)))
result: the same as the previous example

#4
The ipython profile should be updated