I am working on understanding asynchronous js, I know that promises, setTimeout, setInterval just "wait" for the main thread to free up and then they execute. Why is it that when a fetch happens it doesn't block ui like a while loop in a setTimeout would?