Pontryagin Differentiable Programming: An End-to-End Framework for Learning and Control