Previously a whole mesh was stored between undo steps,
This commit uses BLI_array_store to de-duplicate memory use between undo steps.
Memory saving depends entirely on kinds of edits performed,
in own tests 5x-15x less memory use is common.
Compacting the memory does give some overhead however its done in a background thread
so its not blocking in most cases.
New behavior and threading can be ifdef'd out to check for regressions.
See D2026 for details.