Move assemble to separate file

Doesn't really belong in solving.py
Move variational solvers to separate file
Add user-facing LinearSolver class

Use it in _la_solve.
Rationalise different solver utility functions

Once and only once a number of repeated settings.
Vec context managers set halo dirty bit already

No need to do this manually.
Add option to LVS for constant jacobian

If the bilinear form in a LinearVariationalSolver did not depend on any
time-varying coefficients (say) we would reassemble it in a timestepping
loop anyway.  Fix this by allowing the user to specify if the Jacobian
is actually constant (defaults to True).
Test constant_jacobian option to LVS
Merge pull request #396 from firedrakeproject/la_solve_class

* la_solve_class:
  Test constant_jacobian option to LVS
  Add option to LVS for constant jacobian
  Vec context managers set halo dirty bit already
  Rationalise different solver utility functions
  Add user-facing LinearSolver class
  Move variational solvers to separate file
  Move assemble to separate file
Jacobians at midpoints (non-IF)
Jacobians at midpoints (IF)
add explanatory comment to jacobian snippet file