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.
If the gradient has a large magnitude, then the initial step size (before starting the iterations) is small of course. But I am not sure if it is the step size that matters to functions. F will be evaluated at x0+step*dir, that is, at x0 + unit vector. At that point F will have a very different value because of the large gradient. If we force the initial step to be at least 1e-4, then that difference might be too large for floating point numbers when the gradient has a large magnitude.

Also, since F(x0) did not generate a NaN, it shoudl not generate it theoretically (at least) in a small neighborhood of x0 either. That's another reason I see for not imposing lower bound on the step size (at least here) given that the initial direction will (almost?) always be the negative gradient.

A place where a too small step size could cause problems is the line search, but then it is the line search that best knows what minimum step size it can handle (interpolations, etc.), not StepSizer. Therefore the line search should ignore the step size estimate if it is considered too small for its algorithm and replace it with its minimum step size.

What do you think?