Navigates to path. When replace is true, the current history entry is
overwritten instead of a new one being pushed — so in-page state that maps
to the URL (a selected tab, a filter) stays shareable without every change
adding a back-button stop. In-app listeners are notified either way.