Have GeometricDet::bounds() return std::unique_ptr<Bounds>

Before GeometricDet::bounds() returned a pointer to a new'ed Bounds.
However, returning a non-const pointer from a const function can make
the static analyzer think there is a threading problem. By switching
to returning a std::unique_ptr<Bounds> by value, the static analyzer
no longer complains and it makes callers of the routine take explicit
ownership of the pointer (which they should have done all along).
There were only minor changes to other code to deal with this change.