delay allows downstream libraries to use async delay without depending on a specific delay implementation