ENH: Separate halo neighbor exchange code

Implement halo communication in a separate class, HaloNeighborExchange.
Change ParallelHaloMergerTree to use the HaloNeighboExchange object
for its communication.