introduce PromisingTimeout which shrinkwraps some commonality in timeout impl promise behavior