I originally wrote a whole essay to explain monads myself (because they are very tricky to explain), but then I realized that Computerphile has a video on it, and you can just watch that.
Then again, though, the comments of that video aren't all positive. Some people still seem to be confused by it, so I'm going to try to explain it myself as well, with an abridged version of my essay.
Within the context of functional programming, a monad allows you to wrap a value up, optionally with some extra data. You can unwrap the value before passing it to the next parts of a computation (a process called "bind" or ">>="). The next part of the computation will go through the same process and report a new, wrapped up value. In addition, you can also wrap up a value from something that you've computed without a monad (a process called "unit" or, in this case, "return"), to use or return it.
You can call the next parts of the computation multiple times with different values, or not at all, and you can then report whatever you want. You can do this for every step of the computation. For example, you could pass all of the items in a list through the next parts of the computation, or you can pass certain values only if certain conditions are true.
Here is my project that implements monads. It showcases a "Maybe" monad (for a "Maybe" type, although for simplicity's sake it doesn't take a type parameter), and a "State" monad (which, as far as I know, is useless in Snap! because it supports imperative programming anyway, but it was interesting to program, and you can experiment with it).