Hovering a dense chart re-painted the entire chart: shouldRepaint returned
true on any hit change, so each pointer move re-laid-out the grid labels
(~2N TextPainter.layout) and rebuilt the series spline.
- Move crosshair/markers + drag-select rectangle into a separate top
_OverlayPainter; the base _ApexChartPainter no longer depends on hit or
selection, so a hover repaints only the lightweight overlay.
- Cache laid-out TextPainters in TextDrawer (keyed by text + style) so the
repeated layout cost during mount/pan/zoom animations is paid once per
unique label instead of every frame.
Ports unchanged; verified via existing golden + smoke suites.