The point of the `_enqueueWatchRequest` and `_dequeueWatchRequest` is to serialize watch and unwatch requests, which can only be serviced asynchronously. The way we do that is by passing into `_enqueueWatchRequest` a function-callback pair, the former of which implements the watch-or-unwatch request and then calls the callback when it's complete. `_dequeueWatchRequest` constructs these callbacks to know 1) when to process the next watch-or-unwatch request; and 2) to apply the original (i.e., the client's) callback to the result of the watch-or-unwatch command.

The apparently-excessive genericity is due to the fact that we're generalizing over two dimensions: 1) whether or not we're watching or unwatching (the two cases are nearly identical); and 2) whether or not we're processing the request recursively.