Throw const on everything, add specializations for float and double, and fix some type parameters
Permit null values through shared_ptr
Give some sane compile time errors if a user tries to use raw pointers