Cache events so that new clients don't miss out

Currently refreshing a dashboard (without restarting the server) will clear out all the widgets, because each widget has to wait for the next run of its job to get the data.

This adds a simple in-memory cache of the last `Event` for every key, so that new clients connecting can 'catch up' to the latest dashboard view straight away.