InitMaps are created for primitive arrays when the first element of the arrays is initialized, and they are free'd when the last element is initialized, leaving the array in a fully initialized state.
The initmap is also free'd in the Descriptor's destructor function, which is called at the end of a scope.
This works fine when the execution of the program is not interrupted. However, when it is, we never destroy the scopes, leaving the initmaps behind.
To fix this, track the initmaps in InterpState and free them manually in ~InterpState(), so we don't leak the memory and fail on LSan enabled builders.
(Side note: There is a similar problem with the current handling of floating point numbers, i.e. the APFloat might heap allocate some memory and we will leak this when the execution is interrupted).
This interface is now more confusing as to how to use because it now has a public non-default constructor *and* an initialize method. Perhaps we should rename initialize to initializeMapElement so it's clear that the initialize method isn't for the map itself?