As an answer the one question that was not yet addressed, except maybe in the documentation:
All variables can be referenced by all instances.
First off, get global variables out of your head. LOL Think of global variables as belonging to a deactivated instance called "global". It functions exactly the same way as any other normal variable, and if you think of it as just another normal variable belonging to a hidden instance, then there should be less confusion.
If all instances can refer to variables in "global" by using global. in front of the variable's name, then likewise all instances can refer to variables inside another instance by putting that instance's id in front of its variables.
This needs to be expanded upon, however, since you can use the name of the object class the instance belongs to, you can use the ID of the object class the instance belongs to, you can use the ID of the instance itself, or you can use a variable which has the ID or object class saved in it. Which of these you use will affect how the variable is handled, potentially. Let's look at an example:
var inst=instance_create(x, y, oDog);
So the variable inst is a temporary/local variable. It will only exist for the duration of this code. On a side note, throughout the duration of this code, all instances we could reference in this code would have direct access to inst. It temporarily exists locally in this code.
The value of inst will be the id (that's an actual variable all instances in GM are automatically assigned) of the instance of oDog created. An Instance ID (not to be confused with the array instance_id) is an integer with a value of at least 1000001. This differentiates it from an object ID, which is an integer with a value of at least 0. (This will become clearer later.) For this example, we will go ahead and say the value of inst is 1000002 and the index of oDog is 4.
Let's say the object oDog has a variable breed defined in the Create Event. Any instance in the room can refer to our new instance's breed in various ways.
(1000002).breed
inst.breed
(4).breed
oDog.breed
You'll notice that when using direct number values, you need to put parentheses around the number. (Maybe they got rid of this requirement in the latest versions, but I think it's still there.) Also, you rarely ever actually know the number itself, which is why you would typically use a variable or the object name.
Now, as for the object references, when you reference a variable which you proceeded with the name OR index of the object it belongs to, GM will behave differently. If you try to write to the variable, meaning you try to assign a value to it, that value will be assigned to every instance of that object in the room, creating a new variable if one does not already. However - and this is the most important reason why you should nearly always refer to variables through the instance rather than the object - if you try to read a variable that is referenced by its object, if there are multiple instances of that object in the room, a seemingly random one will be chosen. Now, it's not actually random, and you can take advantage of this with testing, but even I would advise against it.
There is one other major difference between referencing and variable. If you recall, at the top of this post I italicized "deactivated". Referencing variables via an object index will not Grant you access to deactivated instances of that object. If you know the actual id of an instance in refer to its variables with the id (for example, inst.breed), even if that instant has been deactivated, you still have access to all of its variables. The instance will not run any of its events, but it will still hold and grant access to its variables.