Heterogeneous Agent Systems: A Review