Add type based get for variant component

Add core::get for variant component
Deprecate the use of std::get<N> for the variant component (this is
technically undefined behavior)

Closes #29