send_wait is a complex one in the sense that it basically allows you to call multiple functions and depending on the one you pick more or fewer parameters are required.
Some examples (since no official documentation from CA exists I'll try to give you my own understanding of these based on experience):
send_wait(0, this, "get_attr_vals", 1, "requestor.zprimary_group");
-> gets the value of the requestor's zprimary_group attribute (assuming that the "this" instance has one)
send_wait(0, this, "call_attr", "group", "set_val", z_grp, "SURE_SET");
-> forces the setting of the group attributes to the value contained within the z_grp variable
send_wait(0, top_object(), "get_co_group");
-> get a "group leader"
send_wait(0, group_leader, "checkin");
-> check in any changes made to the object contained by the "group leader"
There are many more functions that you can call with send_wait. From my understanding send_wait basically executes the call to a function, then waits for some time for feedback (or not) depending on the first parameter. The 3rd parameter is the function you call. Parameters 4 and later are depending on the function you call.
Once the send_wait has been executed you can retrieve the result in msg[0]
e.g.
send_wait(0, top_object(), "get_co_group");
object thegroupleader;
thegroupleader = msg[0];
The trick now is to get to know as many functions as possible, what arguments they take, and understand how they work without any real documentation being available... be careful, especially once you start moving into checking out records, creating new ones or even deleting things things might go seriously wrong. Of course CA will not support you with this.