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:

- [x] generalize for various member attributes (currently hardcoded to `member`)
- [x] more tests
- [ ] ~~experiment with extracting RDNs from DNs to do bulk searches for member entries~~ (separate PR)
- [ ] ~~benchmark against `Group#members` and `Group#subgroups` (`classic` strategy)~~ (separate issue)

cc @jch @github/ldap