Cleanup execOnMany and allow it to be used in both sloppy and non-sloppy mode
Cleanup execOnMany and allow it to be used in both sloppy and non-sloppy mode

The execOnMany function was able to exit prematurely, leaving its child goroutines running.  These would write to a channel that closed after execOnMany returned in findProvidersAsyncRoutine. The function is now able to run both in a sloppy mode where it allows goroutines to be cleaned up after the function has completed as well a safer non-sloppy mode where goroutines will complete before the function returns. The sloppy mode is used for DHT "get" operations like FindProviders and SearchValues whereas the non-sloppy mode is used for "put" operations like PutValue and Provide (along with their bulk operation equivalents).

This fixes https://github.com/ipfs/go-ipfs/issues/8146

libp2p/go-libp2p-kad-dht