A revision is one state of the code.
bzr is snapshot based, meaning that conceptually it stores the whole state of the tree at each revision. This is in contrast to changeset based, where a revision refers to just the changes that were made in that revision. I said "conceptually", as internally bzr uses delta compression to reduce the amount of data that it stores, and so may only record the changes in a revision. However you must always think of a revision as referring to a whole snapshot.
A revision also contains some metadata. In particular it stores the committer, and the timestamp when the commit was made, the log message that was given, and the nick of the branch on which the commit was made. It also stores pointers to the parent revisions, i.e. the revision preceeding it, and the tip revisions of any branches that were merged. Lastly it stores a number of revision properties, these is extra information that can be stored with the revision and is immutable, some uses of them are to store the author of the patch if it wasn't the committer (when given using the --author option of bzr commit), or to store information about the bugs fixed in that revision if using the bug-tracker integration.
A revision also has a name, referred to as a revision id. This is a globally unique identifier for the revision so that it can be referred to without ambiguity. This means that two revisions are identical, if, and only if, they have the same revision id.
A revision may also be referred to using a revision number, however this is not a globally unique identifier, meaning that revision 14 of your branch may not be the same as revision 14 of my branch, even if they are the same project. The only way to know if they are the same revision is to compare the revision ids. This means that when talking about a revision you must either use it's revision id, or also explain which branch you are referring to when you specify a revision number.
Tags point at a revision, and so they may also be used to when referring to a commit, but again, two different branches may have the same tag name pointing to two different revisions, and so you should also give the branch to which you are referring when stating a tag name.