a minimal requestAnimationFrame render loop