Monads explained (sort of) to a C# developer