Add DownloadError to catch a broader range of resource download errors.

Adding a broader exception class allows for errors raised in Resource.fetch
to be caught in upgrade and prevent the process from being killed when
a download fails. This should resolve issue 18364.

Fixes #18364.
Closes #26618.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
Collapse begin..end into def..end and use else clause
Tweak DownloadError message to include wrapped exception