Keynotes: Use to convey MasterFormat codes & general descriptive information
Material Tags: Use to link materials (esp. finishes) on a plan or elevation to a schedule where information required for bidding can be found (see fields in material "identity" tab).
Assembly Codes: Use to provide Uniformat codes & information for estimating/quantity take-offs.
*Or you can manipulate them beyond recognition to meet your own unique needs (not necessarily a bad thing.)
I think that this is an example where there is 'some' redundancy built in to Revit. One 'could' use these tags to achieve the same or similar purposes based on how a user likes to do things. I will assume, however, that we want to catagorically assign each tag a sepatate "official purpose" (for lack of a better term).
First off, let's get assembly codes out of the way. The official purpose of assembly codes is to provide Uniformat information. Uniformat is similar to MasterFormat but there is one main difference. MasterFormat codes decribe "what" an element or material is. Uniformat codes desribe "where" an element or material is.
For example, we can identify a door using both codes. MASTERFORMAT could be: 08 14 23.13 (08_openings|14_doors & frames: wood doors|23_clad wood doors|.13_metal-clad wood doors). UNIFORMAT could be: B2030 (B_shell|20_exterior enclosure|30_exterior doors). MasterFormat describes what the door is while Uniformat describes where in the building the door is. Using these codes in conjunction allows an estimator to quickly create material take-offs from a Revit model. That is, IF all the families and materials have codes assigned to them. Revit ships with a TXT file with all the Uniformat codes and their corresponding descriptions. When you enter a code in the "assembly code" parameter, Revit will reference the file and populate the "assembly description" parameter.
So, the logical question is, what parameter is designed to hold the MasterSpec code? Officially, there is none. However, many will use the "material" or "keynote" parameter to hold this information. The keynote parameter is by far the superior choice. The best reason is because it also references a TXT file. This file can be organized by MasterFormat code. Some firms use the MasterFormat code as the keynote itself. Others will include the code at the end of the item description. Using the actual MasterFormat code to fill the "keynote" field allows for the family type or material to be more easily itentified, using that code, by a 3rd-party add-on or program. Some estimating programs use the MasterFormat code to get pricing information and the Uniformat code to assign it to a construction phase. The main drawback to this method is that the keynote tags tend to be quite large and using them as a quick way to reference a drawing element demands that one not confuse the 6-digit number with another similar 6-digit number referenced on the same sheet.
That leaves material tags. Material tags, by default, display the "description" field in a materials identity information instead of text in a separate TXT file. Obviously, it could be used to provide a quick reference for drawing elements but it falls short by not being to describe actual objects (e.g. door vs. wood) unless the user does a lot of "unoffical use" tweaking (see the 1st paragraph). So, material tags, in my opinion, are best used as "finish" tags in a set of plans that will be sent out to bidders. In this case, all the information in the material's identity information would be highly useful in a finish schedule. It is obviously a poor choice to include information like paint color, tile manufacturer, or upholstery print on the actual floor plan or elevation callout. It's much better to use references like "P1" to indicate the first paint listed in the finish schedule--where all the required information may reside.
Anyway, I hope this helps!