Or, at this point, it'd probably be fine to use aligned_alloc().
But `aligned_malloc` has the same issue, it hides its pointer right before the data.
What are we storing in the heap header that's unimportant enough that it can be overwritten?
It's not unimportant, but it's more robust and it's not as bad as passing a completely invalid pointer to heap_free. The block header might be corrupted, but that's checked and heap_free probably rejects it.