Refactor how viewport scroll and scale work

- Just sets a value on the viewport, and triggers "InvalidateViewport"
- Rendering code takes care of applying the correct transforms
- Insert a "PostRender" event to allow cleanup after rendering
Fix mistake in filtered map.search results