Seems like a rite of passage to explain Monads when you think you finally get them. So here goes for me...
Monads aren't a concrete thing, they're a pattern for chaining operations on values that live in some context.
Two functions are paramount, and their type signatures tell you almost everything you need to know: return and bind.
Return's type is (a -> M a). It puts a raw value, a, into a context, M. That's it.
Bind's type is (M a -> (a -> M b) -> M b). So it takes two arguments, a value already in context, M a, and a next-step function, (a -> M b). Bind lets the context determine how to feed an a into that function, and gives you the resulting M b in the same kind of context M.