solver: check and set type to reconcile class and proto
the solver checks its proto type (SolverParameter.type) on
instantiation:
- if the proto type is unspecified it's set according to the class type
`Solver::type()`
- if the proto type and class type conflict, the solver dies loudly
this helps avoid accidental instantiation of a different solver type
than intended when the solver def and class differ. guaranteed type
information in the SolverParameter will simplify multi-solver
coordination too.