I would choose Spaces. Andrew Boon wrote a great post in the past that explains the differences. See below:
#Spaces module is the most capable of all context-modules since it supports sub-spaces. We generally recommend it for structuring websites by some predefined pattern, like regions, schools, specialities, etc. Say, if you are creating a network for a country, you could use Spaces to generate contexts for States and Towns. Spaces can be private, public and secret. #Groups are more generic. People have certain preconceptions about how Groups work and that makes them useful for allowing standard members create ad-hoc groups without any predefined hierarchy. Groups can not have subgroups. So, people can just add a group like "Proud Bikies" or "We all love pizza" and use it as they will. Groups can be private, public and secret. #Channels are different. They are auto-generated from hashtags and labels. You can pre-create labels for various modules to suggest associations and steer the community towards certain topics. Channels can be followed, but can't be joined. They are always public. Unique feature is that you can associate content items with multiple channels, while you can only post them to one Group or Space, because Groups and Spaces privacy settings define content visibility, making it impossible to post to multiple without complex cross-checking.