Why does accessing window or localStorage during render cause hydration mismatch in Next.js App Router?