Recursive group member search strategy

This adds a recursive search strategy to find all members of a given group, including nested groups.

This implementation has three desirable qualities for a search strategy like this:

1. tracks entries already found so circular or repeated members are queried for exactly once
2. defines a maximum (configurable) depth to recurse
3. queries for the required attributes and nothing else

Unfortunately, `member` attributes are DNs which requires a search per DN, resulting in as many queries as there are unique DNs to search for, resulting in potentially huge query volume. One option is to experiment with querying based on the RDN, but that could result in ill-defined behavior.

Still to do:

- [ ] generalize for various member attributes (currently hardcoded to `member`)
- [ ] experiment with extracting RDNs from DNs to do bulk searches for member entries
- [ ] more tests
- [ ] benchmark against `Group#members` and `Group#subgroups` (`classic` strategy)

cc @jch @github/ldap 

@jch yeah, it's definitely confusing. I think I'm going to make some changes to the API for membership validators in this release which will eventually be breaking so it might be a good time to fix this (in a follow up PR).