Vector array
alt to #16193, appends to #16222
closes #15854

@chris-b1 comment from #16222 : This has the downside of introducing more manual memory management, but on the plus side removes the interim gil acquisition from some algos.

I couldn't figure out how to append to #16222, so I started another pull request, sorry, but added fixes (the missing ``data.m = data.n`` caused a segfault), more checks, and an improved test

FWIW, this allows PyPy to pass the hashtable tests 
These changes require the ``factorize()`` function to use a local ``uniques`` vector, and not a class instance

EDIT: that approach did not work, try allowing multiple calls to ``to_array()`` There are too many edge cases. I will try another approach; adding the external_view_exists flag to the class without changing the underlying data storage strategy