In the first case we lose correct message ordering, in the second case we have the infamous synchronous system message queue. Every possible solution creates a different problem. With a windowing system, events can go to many different windows. So far, no problem. Whenever an event happens, you put a message on the target window's message queue.
Every process has a message queue.
If the process queue fills up, the messages back up onto the system queue. If an app doesn't handle messages and they back up into the system queue, other apps can't get any more messages. The reason is that the next message in line can't go anywhere, and the system won't skip over it. This can be fixed by making apps have bigger private message queues. The SIQ fix does this.