Clearer error message when HTTP download fails

Previously, if `http get` failed, the `download_tarball` function would
still continue since the ERR trap had no effect at that point.

Given a script in the form of `{ ... } || return 1`, the expressions
that are the part of the first group are not subject to ERR trap since
they are non-last in a chain of expressions.

However, since we still can't count on the ERR trap taking effect in
this phase, better just rewrite the function to manually abort.

Fixes #394
Prefer control flow to chaining grouped expressions

Helps avoid the pitfall where ERR trap has no effect.
See 262eb1658cfedcc2bc85c7e8173f65ba7d40b085
Merge branch 'failed-download'