@drcmda noticed that all of the useTrail-specific logic could be removed since useTrail is really just a more constrained useSprings.
Take this for example:
// Shorthand form (more constrained)
const props = useTrail(10, { x: 0, from: { x: 100 } })
// Identical behavior with useSprings
const props = useSprings(10, i => ({ x: 0, from: { x: 100 }, config: { mass: 1 + i } }))
// But useSprings is more flexible (because each spring has its own props)
const props = useSprings(10, i => ({ x: 0, y: i * 10, from: { x: 100, y: 0 }, config: { mass: 1 + i } }))