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.
This needs to be more robust. If the gradient at l is sufficiently sharp, the best fit quadratic is going to have a minimum back in the other direction. This works fine near a bowl (where the gradient is decreasing in value), but we need to be robust to cases that are not.

It is also possible that the function value is larger, but the gradient is still negative. It's hard to know what the quadratic fit will tell it to do there, but we need to guarantee the function value is always decreasing.