Question: Can anyone explain the difference between `use` and `require`, both when used directly and as `:use` and `:require` in the `ns` macro?

Answer: 
`require` loads libs (that aren't already loaded), `use` does the same *plus* it refers to their namespaces with `clojure.core/refer` (so you also get the possibility of using `:exclude` etc like with `clojure.core/refer`). Both are recommended for use in `ns` rather than directly.
As has been mentioned the big difference is that with `(require 'foo)`, you then refer to names in the lib's namespace like so: `(foo/bar ...)` if you do `(use 'foo)` then they are now in your current namespace (whatever that may be and provided there are no conflicts) and you can call them like `(bar ...)`.