Switch puzzle URL when toggling language on a puzzle page
The language toggle did nothing on /p/<lang>/<n> pages: the router
re-derives the language from the URL path on every render, so flipping
ctx.lang alone left the page on its original language while only the
chrome strings changed.
setLang now routes to the equivalent puzzle in the new language via a
pure pathForLangSwitch() helper, keeping the URL and ctx.lang in sync.