Have a look at this. It's written for C++ but the general concept still applies.
You aren't allowed to destroy anything while Box2D is doing the simulation step. Your ContactListener is called while this simulation is happening and you instantly destroy the body. That's not allowed. You have to store the bodies to be destroyed and do that right after world.step
.
Here you can see how it is done as a quick solution in the tests, but it might not be the best solution.