BENCH: add conjugate gradient benchmarks
BENCH: improve conjugate gradient solve benchmark
BENCH: restore a commented out line
Merge pull request #4306 from argriffing/add-cg-benchmark

Add benchmark for conjugate gradient solver.
ENH: sparse.linalg: refactor LinearOperator class hierarchy

... and document how to create a proper subclass of it: by
implementing some "kernel" methods (protected methods for the
C++/Java crowd) that receive properly validated input from
public wrapper methods.

Behavior of LinearOperator(matvec=some_callable) is preserved
using __new__ magic to create a factory function that returns an
instance of the proper subclass. No more monkey-patching!
ENH: sparse.linalg: add adjoint to LinearOperator

Implemented for the basic operators; still need a general implementation
that uses the rmatvec method.
BUG: sparse.linalg: remove broken Py3 support hack
MAINT: sparse.linalg: use new LinearOperator facilities
ENH: sparse.linalg: default _rmatvec and _adjoint
BUG/TST: sparse.linalg: test expm exact and inexact algorithms

Code previously failed on sparse matrices.
ENH: sparse.linalg: implement matvec as matmat and vice versa

Also improved the subclassing documentation and put in some input
validation.
DOC: sparse: intro + example for LinearOperator interface
DOC: sparse.linalg: prefer dot method on linear operators
TST: update a custom linear operator class in the arpack tests to use the new interface