[Reviewer: Mike] Avoid invalid memory access and memory leak on expiry of DNS entries

Mike,

This switches the value stored in the DnsCacheExpiryList from a pointer to the cache entry to a DnsCacheKey which we can then use to look up the entry. This is marginally less efficient but much safer - it avoids https://github.com/Metaswitch/sprout/issues/414.

I've also fixed https://github.com/Metaswitch/sprout/issues/415 by clearing the cache before we expire it.