Have a look at the Group module (a new module as of D7). It should address most (if not all) of your requirements. And it offers a potential alternative to the Organic groups module. Here is a quote from its project page:
Organic groups allows content itself to be groups, which isn't always what people want. It relies on an entity reference field to keep track of the ties between a group (node, term, ...) and its content (node, term, user, ...).
Group instead creates groups as entities, making them fully fieldable, extensible and exportable. Every group can have users, roles and permissions attached to it. Groups can also act as a parent of any type of entity. Seeing as a group itself is also an entity, creating subgroups is very easy.
Some major differences between these 2 modules are:
- Group started in D7 only, taking full advantage of entities introduced in D7.
- Organic Groups is commonly perceived as a huge module, which carries a lot of "legacy" from pre-D7 releases.
- A D8 version of Group is in the pipeline and actively being worked on these days (expectation is "only a few months from now").
Additional Group sub-modules
Extra features can be enabled via these sub-modules:
- Group Add: Add members to a group without their consent.
- Subgroup: Make group to belong to another group.
- Group Invite: Allow group members to invite people into their group.
- Group Node: Enables Group functionality for the Node module.
- Group member profiles: Create multiple fieldable member profiles, which can be attached to a member.
Have a look at my answer to "How to create basic Organic Groups functionality with flags and references?" for way more details about it, such as available integration with other (commonly used) modules.