Self-assignment, vector tests, smart pointer

Reimplemented smart pointer so it's more efficient and incurs fewer
allocations.

Added some unit tests for Vector (incomplete).

Added self-assignments tests to copy/move operator = throughout the
library.

Changed a few constructors that took const lvalues and rvalues and which
wound up eventually inevitably making a copy to take by value.