menu(key user,string title,list buttons)//make dialog easy, pick a channel by itself and destroy it after 5 seconds
{
menu_channel = (integer)(llFrand(99999.0) * -1);//yup a different channel at each use
menu_handler = llListen(menu_channel,"","",""

;
llDialog(user,title,buttons,menu_channel);
llSetTimerEvent(5.0);
}
could read like this:
menu(key user,string title,list buttons)
{
llListenRemove(menu_handler);
menu_channel = (integer)(llFrand(99999.0) * -1);
menu_handler = llListen(menu_channel,"",user,""

;
llDialog(user,title,buttons,menu_channel);
}
3 major changes (aside from removing the comments just to make it easier to read)
1. Added "listenRemove". basically, each time a new menu is sent out, it uses a new channel and creates a new listen. By adding "listenremove" we aren't just filling up the sim with unused listens. Scripts can ususally only open about 60 listens before they crash. Your script would eventually have crashed in this way.
2. Listens use a key, not a string, in the third variable. You had a "NULL_STRING" there, not a "NULL_KEY"... That wasn't properly formed.. though it seemed you were "getting away with it". I've made your listen ONLY listen to the person clicking.
3. I took out the Timer call in the menu. Someone could have clicked your door every 4 seconds and kept it from turning solid.. "holding the door open". Your timer doesn't have handling for closing the listen, so since you're leaving that listen open until the next use, (and now it will only listen to the previous toucher).. it's kind of unneeded.
Some people will say you should ALWAYS close your listens.. and the next time someone clicks, your list listen will be closed and then reopened. One open listen isn't really that big of a deal, especially as it will ONLY hear the toucher (and avatars really can't speak on negative channels without help)
Wanna make it a little bit nicer to the sim? try this. Insert the following line as the first command in your listen event:
llListenRemove(menu_handler);
This will close the only open listen if the clicker pushes either of the two buttons on the dialog. If they log off, or teleport away, or press "ignore".. then that listen will still stay open, but as I mentioned before, this really is a relatively negligible problem, since the script will "recycle" that listen the next time it's used.
You might want to add a "No Thanks" button to the dialog. (you can cancel the listen on that button as well.. and then people who decide they DON'T want to enter your space, are tempted to close the listen with a shiny "no thanks" button.
You CAN add a "timeout" structure to the timer, and use that.. but all things considered, a single open listen on "-random" really isn't all that much strain on the sim.