In many cases, you can find that words which initially appear to be absolute synonyms actually have slight differences in meaning, so that one can be used in a specific setting while the other cannot. Is there such a difference for кидать and бросать, or are they completely interchangeable?
In the meaning "to throw" both words “кидать/кинуть” and “бросать/бросить” are equal.
But only “бросать/бросить” has meaning "to stop doing something, to leave some place, to break relationship"
Бросить жену (to divorce)
“кидать/кинуть” also has other meaning: "to deceive or betray somebody, not fulfill the promise"
Бросать means "to leave, get rid of, or stop doing something" e.g.
There is a fleur of a passiveness in this word. Бросить реплику or бросить взгляд means to say or to look at smth. briefly, without much attention.
The verb кинуть on the contrary implies active action. That's why кинуть кого-то is a really bad thing to do.
As always, there are exceptions. One can say бросать гранату and mean a really active and thoughtful deed, not "to get rid of a grenade" :)
Бросить can be employed in metaphorical cases such as "бросить взгляд" (cast a gaze), "кинуть взгляд" is weird (for me). More examples (from Lingvo):
бросать обвинение — hurl an accusation
бросать реплику — fling (out) a remark
бросить (обидные) слова кому-либо в лицо - fling (nasty) words at somebody \ into somebody's teeth.
There is no difference between "кидать" and "бросать". Ideally, "кидать" means to throw further away than "бросать", especially if there is no need to search for what was thrown away. But I don't think that today speakers bother about it.
The word "бросать" means a more intense action directed away from oneself, and it doesn't matter how far away something is thrown. For me this word is close to the meaning of word "breast", but this is not what the dictionaries say. Vasmer's dictionary also points out that word "brush" comes from the same root as "бросать", that is, there is one common part of the meaning: abrupt movement. As for "кидать", Vasmer tells that it means simply to throw smth in order to get rid of it. it On the contrary, there is definitively a difference in the meaning of derivatives. For verbs "закинуть" and "забросить" (i.e. the action is completed), "закинуть" means a less intense action. For example, I would rather say "забросить мяч в кольцо" than "закинуть мяч в кольцо". Also "в третий раз закинул старик невод" - the old man threw the net for the third time - he threw it far-far away, but not without a goal.
"Подкинуть" and "перекинуть" mean to throw something heavy, but there is no such thing for "подбросить" and "перебросить". Some examples:
Incorrect: "меня подкинуло", "подкинуть в воздух". Better: "Три раза подкинули, один раз поймали."
"Докинуть" stresses that the distance was great, "добросить" stresses that the goal was reached.
"Скинуть" and "сбросить" are equivalent.
"Откинуть" means that the thing that was thrown away is not interesting. "Отбросить" means that the thing was thrown away violently and deliberately.
"Вбросить" exists while it is not really possible to say "вкинуть" (unless you say to throw something rather big (a man, for example) into a place which is approximately equally big (into a window)).
Of course it is all only my humble opinion and it all is based on my own knowledge of Russian.
I would say there is a slight difference between кинуть and бросить in the meaning to throw.
Кинуть implies to propel something, throw with some force in a particular direction, for example кинуть камень в окно: one actually throws the stone into the window.
Бросить has a slight connotation of to let go, and is related to the meaning stop doing something (in this case, stop carrying), for example бросить сумку на пол: one just lets go the bag and falls to the floor on its own.
Nonetheless, both words are often used interchangeably.
As for other meanings of the words, other answers summarize them quite well.
бросить - can be just "put smth down", like, "put the gun down" - "брось пистолет". "кинь пистолет" would be wrong. Also, I believe that "бросить" can be used as harmful action but "кинуть" can't. кинуть - can mean deceive (slang).
Maybe there is geographically difference in use of these two words.
Criminal slang "кидать" is not exactly "to betray", more likely it means "to cheat". "Кинуть лоха" is "to make some business, often illegal, with the victim, and then disappear with all his money".
Although, "кидать" is similar to "покидать", "to leave someone", and in this case it's close to "to betray".