Practical Monads in C#