Add new `side_effects` function

Large scale feedback on this would be appreciated.  I suspect that there is probably a better way to accomplish this.

In general the goal is to provide a mechanism to support side effects.  I suspect this is the watered down version of the core idea behind monads.

Mostly I suspect this to be used with debugging, e.g.  

```Python
seq = side_effects(print, seq)  # hey look, Py3's print-is-a-function is a nice idea
result = do_work_on(seq)
```