run loop operates on requestAnimationFrame where available