support implicit type convertions

two pass value type index calculation
   * exact match std::is_same<>
   * implicit conversion is_convertible<>
update to use recursive_wrapper<T> -> T conversions
unit test : update to use latest variant impl