the code currently has a really simple pipeline that might change entirely, but currently it generates a `candidate_index` proc that takes in a string and returns its index in a dense array; code generation works like this: 1. analyze static strings and break them up into partitions based on length; some short strings might need to be broken up from longer strings because their initial bytes make them impossible to distinguish from others with only the safe # of bytes 2. for every partition, find the minimum number of 8 byte loads to distinguish all the strings; call these "byte groups" 3. synthesize 2 functions, such that A(byte group) in [0, num buckets) for every possible input, and if A(a) = A(b) then B(a) must not equal B(b) 4. this means A breaks things up into buckets and B distinguishes things intra-bucket. then find "pilots", uint16 constants that feed into the final function, slot = (B(byte group) + pilots[A(byte group])) & mask, such that this creates no overlaps between elements