Faster found-sound: range-fetch a chunk, trim, prewarm, dedupe cache

First Play was ~50s because each found source downloaded + decoded in full. Now:

• fetchAudioBytes() uses an HTTP Range request for the first ~1MB and only falls back to the whole file if the host ignores Range or the truncated stream won't decode.

• trim the decoded audio to 45s before encoding (syncgrain only needs a window) — shrinks the WAV and the Csound ftgen table load ~4x.

• builder prewarms the arrangement's sources in the background on load, so the first Play is instant.

• decodeUrlToWav now caches the in-flight Promise, so prewarm + a Play click share one fetch instead of double-fetching.

▶ Play it: Rail Replacement Rapture — a bed-heavy genre where the found-sound layer carries the room https://stellate.app/?genre=transitwave&seed=1275&path=749.12536,768.12569,730.12569&xdur=13.122

fee6cf8 https://github.com/aboard-io/stellate/commit/fee6cf8bd568ce26827b1502a6e057ff71aab17b