Target association and refinement design
I am not happy with the current design for the target association and refinement. Both of these have a single class responsible for:
- managing kernels
- calling kernels
- actual algorithmic logic.
Contrast with the FMM, where there is a splitting of these responsibilities:
- code container manages kernels
- wrangler calls kernels
- logic is in drive_fmm.
I think it might be cleaner to adopt this way of doing things. This is also related to #30, because the kernels that the refiner and target associator use should have their own container.