Several questions which others have answered well, and:
> 2) In somewhat layman terms, what exactly is the difference between > NP-Hard and NP-Complete?
First, there's just no way to achieve both "lay terms" and "exactly". I'm going for the latter.
There is a precise and broadly accepted definition for "NP-Complete", but no such agreement on what "NP-Hard" means.
"NP-Complete" describes the languages L, such that
1) L is in NP, and
2) Any language in NP can be polynomially-reduced to L.
Some references consider "NP-Hard" to name the set of languages, that fulfill (2) but not necessarily (1).
Other respectable sources consider "NP-Hard" to describe functions, not languages. There are two variants: Some consider NP-Hard to be functions to which deciding an NP-Complete language can be polynomial-time reduced. Others require a poly-time reduction in both directions; to and from deciding an NP-Complete language.