Use Maybe instead of STM for handlers

Previous version used STM's retry to signal that a handler
is incompatible with a message. However, this is really an
abuse of the retry mechanism and can be fragile. Using the
MonadPlus instance of Maybe values does the same thing and
doesn't interfere with the STM transaction.