SI-7502 removing non-existent element from ListMap returns same map.

Current imperative version constructs a new ListMap regardless of
the fact the map doesn't contain the element. Replace it with the
tail-recursive variant that conserves. Also replace some usages with
the invariant now held.
Merge pull request #2579 from vigdorchik/list_map

SI-7502 removing non-existent element from ListMap leaves it unchaged.