Hi Lisa,
1)
That code limits to the scope of the css. What I mean is code like "#outerWrapper #contentWrapper" corresponds to HTML like "<div id="outerWrapper"><div id="contentWrapper"></div></div>". Notice how the #contentWrapper is nested inside the #outerWrapper div. If the #contentWrapper was somewhere outside of the #outerWrapper, the css would not be applied. It justs a way of setting the scope of your css and should help with possible cascading issues if you are too general with the css declarations.
2)
#wrapper - will style any element with an id of wrapper
div#wrapper - will only style a div tag with an id of wrapper
If you prefix and #id or .class with a HTML tag name, it just limits what the css can be applied to. In general, being this specific is not a requirement, but it might make your css easier to read in some cases. For example, if you have css like "input.phoneNumber", that would cleary indicate you were styling an input format element.
3)
The reset css at the top of the css code is to help level the field between the various browsers. It helps each browser be more consistent in how it renders things since we are essentially telling it what to use as a baseline.
CSS is read top down and things will cascade down like you mentioned. So say at the top of the css you have a very general declaration like "a { color: red;" and later on you have "a.customLink { font-weight: bold; }", your a.customLink will also be read since the css would cascade down.
--
Let me know if you have any other questions.