Set warnings on a per-target basis.
Simplify and use functions.
Move external build into separate CMakeLists.txt.

This lets us do directory-level settings and only export the bits we
need (namely, the list of include dirs).
Allow scope to be specified in SetWarningLevel.
Add build for external libs.