Simple cross-browser requestAnimationFrame wrapper with setInterval fallback