Complex step

- Removed symbolic differentiation
- Added complex step
- Added detection to see if complex step is possible. Falls back to finite step if not.
- Differentiation works if passed integers rather than floats.