Types for Proofs and Programs