Hi Brian,
This is an API/semantic change, and the text of all MEAP versions is out-of-date. It's fixed in the online version of the example code and in the typeset e-Book, which should be released officially within days. In the meantime, replacing merge() with orElse() will do the trick.
I'll explain the change:
Part-way through the book I made the decision to change the semantics of Sodium to only allow a given stream to fire once in a transaction. This makes it so simultaneous events are truly simultaneous, meaning that no ordering can be detected between them. I think this is an important change. The name orElse() means that in the simultaneous case, the right-most event will be dropped. If you want a different policy than this, use the merge() method, which takes a second argument specifying how the value should be merged in the simultaneous case.
Steve