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.