LoadingMessageSourceProvider: fix gross bug in expiry tasks

Prior to this, we grabbed the list of tasks from the sources map and cleared the
map from within the synchronized section, and cancelled the tasks _outside_ the
synchronized section.

Which means a caller could potentially get a task which was cancelled... As a
result, attempting to .get() the result would throw a CancellationException.

Fortunately, I made the mistake to set the initial delay of the periodic task to
0, so I could see this bug fair and square. Phew!