This article talks about some of the options of adding an additional level of abstraction on top of the monad. The idea is that some people find it difficult to reason about monads, because they have so many specific applications (read 10 monad articles and you'll get 10 different definitions for what they are).
TLDR: It's an abstraction of an abstraction that might help you reason better about complex things.
Haskell's do-notation could almost be said to abstract side effects because it makes monad actions look like imperative programs, but they're still pure-functional unless they're in the IO monad.
A more accurate explanation would say that monads are just an abstraction that encapsulates program logic. Someone unfamiliar with the concept might not see WHY that's important. So my example was tangible, but not all inclusive.
One of the big issues with abstract concepts like monads, is that most people insist on using a long-winded complex explanation up front. I find it's better to pique interest, and make the concepts accessible, with the hope that the reader later is willing to dig in and learn more themselves. I probably could have done a better job of explaining that the IO monad isn't the only monad, but I think it did a "good enough" job of explaining a way to think about them.
Learning about monads without (applicative) functors makes everything look like an over-complicated nail.
One very good explanation on the topic: http://blog.sigfpe.com/2006/08/you-could-have-invented-monad...
Monads are (quote) elephants: http://james-iry.blogspot.com/2007/10/monads-are-elephants-p...
Monads can be implemented in OO languages, like ruby: http://moonbase.rydia.net/mental/writings/programming/monads...