Change the way sent notifications are recorded, from a channel to a slice; this enables correct handling of timeouts.

Now instead of generating success responses and sending them to ourselves (which was broken and a dumb idea in the first place),
we just record the time each notification was sent and scan through the list of sent notifications every so-often to discard the old(er than TimeoutSeconds) ones.
This resolves the race condition (I think)
Add clean shutdown mechanism.
reduce indentation in sender()
Strip out excessive logging
Clarify the shutdown mechanism with comments