Added DifferentiationMethod enumeration

This represents the different methods in which the values of the derivative
of the target function can be obtained when using specific solvers.
Modified NewtonRaphsonSolver to use DifferentiationMethods

This allows the solver to use symbolic differentiation to obtain values for
the derivative function
Modified NewtonBisectionSolver to use DifferentiationMethods

This allows the solver to use symbolic differentiation to obtain values for
the derivative function
Added divergence tests to Newton Raphson solvers

This throws an exception if the current guess is infinite - meaning that
the algorithm has diverged and will not give an answer using the current
solver parameters.