Add fzy.filter_range() which computes only scores, appends to caller-provided arrays instead of allocating tables per match, takes an inclusive range so callers can process a large list in slices while handling pending input in between, and accepts optional pre-lowercased haystacks so repeated calls don't allocate a lowercase copy of the whole list each time.