In case where the message is encrypted and you request cross-signed keys
from another session you may end up in a situation where `media` doesn't
exist as you didn't receive keys, yet you have the message's type.
This commit fixes this problem by checking if the media is even available.
With help from Palid.
This does two major things:
1. Makes the tile part of a file body clickable to trigger a download.
2. Refactors a lot of the recyclable code out of the DownloadActionButton in favour of a utility. It's not a perfect refactoring, but it sets the stage for future work in the area (if needed).
The refactoring still has a heavy reliance on being supplied an iframe, but simplifies the DownloadActionButton and a hair of the MFileBody download code. In future, we'd probably want to make the iframe completely managed by the FileDownloader rather than have it only sometimes manage a hidden iframe.