teach the dss chunk allocator to handle new_addr

    #include <stdlib.h>

    int main(void) {
        size_t chunk = 4 * 1024 * 1024;
        void *ptr = NULL;
        for (size_t size = chunk; size < chunk * 128; size *= 2) {
            ptr = realloc(ptr, size);
            if (!ptr) return 1;
        }
    }

dss:secondary: 0.083s
dss:primary: 0.083s

After:

dss:secondary: 0.083s
dss:primary: 0.003s

The dss heap grows in the upwards direction, so the oldest chunks are at
the low addresses. Linux prefers to grow the mmap heap downwards, so the
trick will not work in the *current* mmap chunk allocator.

In theory, it could also extend a span of recycled chunks to satisfy the
request, but it would involve some refactoring.