Event-driven programming is a popular paradigm, particularly suited for interactive applications and networked applications, which must do things in response to input from the user or a network socket. It's a built-in part of how the DOM works in web programming, and there are many popular libraries which add or extend event-based functionality to mainstream languages. So yes, events are a perfectly good idea to build a programming language around.
However, like all programming paradigms there are indeed some drawbacks to using events for everything. These drawbacks are well summarised in the book Functional Reactive Programming by Stephen Blackheath & Anthony Jones, which I'll paraphrase here:
- Multiple listeners to the same event may be invoked in an unpredictable order. There may be logical dependencies between listeners to the same event, which the event listener can't know about.
- A listener might not get an opportunity to subscribe before the first event is triggered.
- If many listeners update some shared mutable state, the program becomes like a messy state machine that is difficult to reason about.
- Listeners on different threads can cause deadlocks, and an event published on a different thread may be received by a listener after it unsubscribed.
- A listener may forget to unsubscribe when its owning object is no longer needed. This keeps its callback function in memory, and the callback function holds a reference to the object, causing a memory leak and performance degradation as the publisher still invokes the stale callbacks.
- A listener which triggers new events may accidentally cause unbounded recursion.
Blackheath & Jones call these the "six plagues of listeners". To these, I would add another one:
- If some data needs to be recomputed when any data it depends on is updated, then it may be wastefully recomputed several times if multiple dependencies change at the same time, each triggering their own "update" events.
Functional reactive programming (FRP) is a paradigm related to event-driven programming which addresses these issues, although it comes with its own downsides ─ particularly its conceptual complexity, difficulty of implementation, enforcement of a rigid programming style, and it can make programs more difficult to debug. That said, I have found it a very pleasant paradigm to write in myself, albeit I had to read the aforementioned book cover-to-cover a few times before it clicked. If you're serious about designing an event-driven language, there are likely some ideas in that book which will be useful to you, even if you don't decide to go full FRP with your language.