1)Создавать дополнительный EventDispatcher нет необходимости. EventDispatcher входит в цепочку наследования Sprite(caseyryan вам даже скриншот выложил). Т.е., если ваш герой унаследован от Sprite, он сам может спокойно рассылать события

Код AS3:
hero.dispathEvent(new Event("gameOver"));
2)Почему не работает у вас. Вы рассылаете событие одним экземпляром GameOverEvent, а слушаете(ждете) это событие от другого экземпляра. У вас сейчас что то типа этого:

Код AS3:
var eventName:String = "someEvent";
var dispatcherA:EventDispatcher = new EventDispatcher();
var dispatcherB:EventDispatcher = new EventDispatcher();
dispatcherA.addEventListener(eventName, eventHandlerA);
dispatcherB.addEventListener(eventName, eventHandlerB);
dispatcherA.dispatchEvent(new Event(eventName));
private function eventHandlerA(e:Event):void
{
trace("dispatherA");//Этот трейс выполнится
}
private function eventHandlerB(e:Event):void
{
trace("dispatherB");//А этот не выполнится пока dispatcherB не "плюнет" событие
}
3)И во тут

Код AS3:
public function Compozition(gameOverEvent){
gameOverEvent = new GameOverEvent();
вы присваиваете переменной переданной в конструктор Compozition новый экземпляр GameOverEvent, т.е. вот тут, по идее, должна выскочить ошибка, т.к. gameOverEvent там будет null

Код AS3:
private function endListener(e:TimerEvent):void{
if(timer.currentCount == 10){
gameOverEvent.gameOverListener();
//Вот тут ошибка т.к. gameOverEvent==null
}
}