Wrap save() in a 300ms debounce to prevent rapid serialization
when multiple state changes fire in quick succession (e.g. removing
several items or adjusting volume).
Replace all linear find/findIndex/some scans with a derived Map
keyed by track.id. This makes currentTrack, currentIndex, hasTrack,
add, playNext, remove, and addAll all O(1) for ID lookups.
addAll() now collects all new tracks and pushes them in a single
array operation instead of calling add() in a loop, which triggered
per-item reactive updates and O(n²) existence checks.