--download: Use `time.monotonic()` and rework code to prevent `ZeroDivisionError` specific handling
diff --git a/httpie/downloads.py b/httpie/downloads.py
index bd53684d1c..e38c56e249 100644
--- a/httpie/downloads.py
+++ b/httpie/downloads.py
@@ -9,7 +9,7 @@
 import sys
 import threading
 from mailbox import Message
-from time import sleep, time
+from time import sleep, monotonic
 from typing import IO, Optional, Tuple
 from urllib.parse import urlsplit
 
@@ -350,7 +350,7 @@ def started(self, resumed_from=0, total_size=None):
         assert self.time_started is None
         self.total_size = total_size
         self.downloaded = self.resumed_from = resumed_from
-        self.time_started = time()
+        self.time_started = monotonic()
 
     def chunk_downloaded(self, size):
         assert self.time_finished is None
@@ -363,7 +363,7 @@ def has_finished(self):
     def finished(self):
         assert self.time_started is not None
         assert self.time_finished is None
-        self.time_finished = time()
+        self.time_finished = monotonic()
 
 
 class ProgressReporterThread(threading.Thread):
@@ -389,7 +389,7 @@ def __init__(
         self._spinner_pos = 0
         self._status_line = ''
         self._prev_bytes = 0
-        self._prev_time = time()
+        self._prev_time = monotonic()
         self._should_stop = threading.Event()
 
     def stop(self):
@@ -406,16 +406,11 @@ def run(self):
             sleep(self._tick)
 
     def report_speed(self):
-
-        now = time()
-
+        now = monotonic()
         if now - self._prev_time >= self._update_interval:
             downloaded = self.status.downloaded
-            try:
-                speed = ((downloaded - self._prev_bytes)
-                         / (now - self._prev_time))
-            except ZeroDivisionError:
-                speed = 0
+            speed = ((downloaded - self._prev_bytes)
+                     / (now - self._prev_time))
 
             if not self.status.total_size:
                 self._status_line = PROGRESS_NO_CONTENT_LENGTH.format(
@@ -423,10 +418,9 @@ def report_speed(self):
                     speed=humanize_bytes(speed),
                 )
             else:
-                try:
-                    percentage = downloaded / self.status.total_size * 100
-                except ZeroDivisionError:
-                    percentage = 0
+                percentage = (downloaded / self.status.total_size * 100
+                              if self.status.total_size
+                              else 0)
 
                 if not speed:
                     eta = '-:--:--'
@@ -457,17 +451,10 @@ def sum_up(self):
         actually_downloaded = (
             self.status.downloaded - self.status.resumed_from)
         time_taken = self.status.time_finished - self.status.time_started
+        speed = actually_downloaded / time_taken if time_taken else actually_downloaded
 
         self.output.write(CLEAR_LINE)
 
-        try:
-            speed = actually_downloaded / time_taken
-        except ZeroDivisionError:
-            # Either time is 0 (not all systems provide `time.time`
-            # with a better precision than 1 second), and/or nothing
-            # has been downloaded.
-            speed = actually_downloaded
-
         self.output.write(SUMMARY.format(
             downloaded=humanize_bytes(actually_downloaded),
             total=(self.status.total_size

It simplifies speed/percentage handling. It also expands coverage as testing previous `ZeroDivisionError` corner-cases is not easy.