Differentiable Programming for Differential Equations: A Review