simplify the exchange allocator

* stop using an atomic counter, this has a significant cost and
  valgrind will already catch these leaks
* remove the extra layer of function calls
* remove the assert of non-null in free, freeing null is well defined
  but throwing a failure from free will not be
* stop initializing the `prev`/`next` pointers
* abort on out-of-memory, failing won't necessarily work
add a contains_managed intrinsic
vec: use contains_managed instead of box header
stop initializing ref_count in exchange_alloc

this is never read anymore
managed: rm RC_EXCHANGE_UNIQUE constant

this is no longer used, exchange allocations do not set ref_count