You suggest these are built in
No. The Arduino runs a single thread. It is up to you to deal with events as they happen, including discovering that the events have happened.
A good example is serial data arriving. Periodically, you need to check to see if that has happened. That is where Serial.available() is useful. You then deal with (by collecting and storing) all pending serial data, until there is no more, or until the collected data represents a complete packet. Then, you deal with the collected data, and reset to be ready to collect more.
There are other asynchronous events completion tasks that trigger interrupts, such that you can provide an interrupt handler to deal with them. For instance, reading an analog pin typically takes time. You can just wait until the reading is complete, or you can use the asynchronous method (Nick Gammon has documented it) to start a reading happening and to be notified when it is complete.