ENH: Make non-aggregating methods on groupby groups optionally return groups
#### Is your feature request related to a problem?

I want to apply chained operations on the same groupby groups without having to actually make identical costly groupby calls before each operation. The Related problem is available on the following SO question:

https://codereview.stackexchange.com/questions/249222/get-exactly-n-unique-randomly-sampled-rows-per-category-in-a-dataframe


#### Describe the solution you'd like

Add and optional argument that changes the behavior of non-aggregating methods on groupby groups to return groups instead of DataFrames.

This is useful if you want to make multiple chained operations on the Groups without having to do a GroupBy each time (split once, apply multiple times, combine once). This would also have the benefit of actually decoupling the apply and combine parts of the split-apply-combine paradigm when possible. This does not make sense for aggregating methods, but for something like `groupby.DataFrameGroupBy.filter` or `groupby.DataFrameGroupBy.sample` (maybe anything that does not reduce the groups to a single value) returning groups was actually the expected behavior for me and for at least the person who answered the SO question above.

#### API breaking implications

This would not break the API afaik, as the current behavior can be set as the default i.e. `return_groups=False`.

#### Describe alternatives you've considered

The alternatives that I could come up with all involved multiple groupby calls (I think there is an implicit call in `value_counts`). For my specific use case (see SO question), an option to drop groups with insufficient rows would actually suffice, but I think the proposed solution is more general and decoupled.

#### Additional context
Here is the code to randomly sample exactly `n` rows per group, dropping groups with insufficient rows:

```python
n = 4
df = pd.DataFrame({'category': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 1],
    'value' : range(12)})

# sample exactly x rows per category
df = df.groupby('category').filter(lambda x: len(x) >= n).groupby('category').sample(n)

# proposed alternative solution:
df = df.groupby('category').filter(lambda x: len(x) >= n, return_groups=True).sample(n)
```

I also expected `filter` to actually pass groups instead of DataFrames to the lambda.