add back jemalloc and begin porting to it

This time, there is no attempt to replace the C allocator. The revision
used here is the stable 3.6.0 release.

Since the jemalloc non-standard API doesn't accept null pointers to the
reallocation and deallocation functions, some of these checks need to be
added outside the calls on the Rust end. This is already necessary to
extend the non-null pointer enum optimization to vectors.

Closes #11807