GMS2 is anything but random, you just need to change your way of thinking about it. I feel as though your idea of what GMS2
should do, is getting in the way of you learning what it
does do.
As for "helpful guidelines", since you seem to enjoy understanding by analogy, it is helpful to think of code execution as being similar to reading a book. If all of the code in your game (the code of every event, of every instance, of every object, etc., all of it) were
one (bold to emphasize it is only
one) big book, then GMS2 reads it how you would: line by line, from front to back. Except GMS2 reads this book front to back once every (as someone above said) second/game_speed (generally every 1/30th or 1/60th of a second). However, GMS2 will
only read the paragraphs that you tell it to read. You can think of paragraphs as a single block of code for this analogy. And you tell GMS2 to read certain paragraphs using
triggers or
events. So for your example, GMS2 read the paragraph that said "stop animating the current sprite of this object!", but
only once the animation was ended; the animation ending being the
trigger. GMS2 then continues to read the rest of the book, and reads it again, and again, every 1/60th of a second, reading
only the paragraphs that you told it to read using triggers and events.
To further illustrate this point, the reason you can't control animations in the button pressed event, is because GMS2 reads that paragraph
ONLY WHEN the button is pressed (so it reads that paragraph once, and only once, and
only on the step that the button was pressed). And it will not run any of the code inside that event again, at least not until the button is pressed again. Since animations happen over time, they won't animate in an event that is triggered, and then stopped after only 1/60th of a second. For this, you would need to introduce some trigger that turns on/off over time as well.
Same as with a book (might not apply to non-fiction, but lets not muddy the already-muddy analogy), the order in which you read the book is essential to understanding it. When reading a crime novel, you won't understand "...and it was Bob who was the murderer the whole time!" if you don't know who Bob is. GMS2 reads code in very much the same way. That is why others have said that it is important to understand the
order of events. This is because you need to know in what order the compiler is reading your code. The order in which it reads your code may not seem important now, but it is essential if you want to be a proficient coder.
Objects, events, instances, etc. are all just ways of organizing the code so it is understandable and intuitive to
you. GMS2's compiler will still go through all of it, one line at a time, and will only read the lines you tell it to. So in this sense, it is actually very, very, linear.
Hopefully this helped a bit.