Add a StepSizer based on quadratic interpolation

Interpolating step sizer implemented as a first step for adding conjugate gradient method in order to have a reasonable estimate for the initial step size (also for gradient descent method where it replaced ConstantStepSize).

It was necessary to change StepSizer interface because these estimates based on interpolation often need the descent direction that is readily available (some also need the previously accepted step size, but that one is harder to come by, most easily perhaps as ||x_k - x_k-1||).

The name QuadraticInterpolateStepSize could be shorter, but on the other hand it will rarely be used by the client code.
Are you sure this doesn't need a cap on the lower end either? If the gradient has a very large magnitude, it would take a very tiny step. It seems like this should have a lower bound like 1e-4 or something (where you would get some finite-difference-ish approximation). Taking a step of 1e-14 (or even 1e-8) is going to cause havoc for a lot of functions.