switched to a simple array-based implementation (instead of a hash-table)

It's considerably simpler than the hash-table based version, and the main
goals of this design is to:

(a) minimize the palloc overhead - the whole array is allocated as a whole,
    and thus has a single palloc header (while in the hash table, each
    bucket had at least one such header)

(b) optimal L2/L3 cache utilization - once the hash table can't fit into
    the CPU caches, it get's considerably slower because of cache misses,
    and it's impossible to improve the hash implementation (because for
    large hash tables it naturally leads to cache misses)

Hash tables are great when you need to immediately query the structure
(e.g. to immediately check whether the key is already in the table), but
in count_distint it's not really necessary. We can accumulate some elements
first (into a buffer), and then process all of them at once - this approach
improves the CPU cache hit ratios. Also, the palloc overhead is much lower.
SQL scripts used for benchmarking (generating data, etc.)
added a gitignore with *.so / *.o patterns