The Guarded Lambda-Calculus: Programming and Reasoning With Guarded Recursion for Coinductive Types