more robust implementation for BOOST_RANGE_EXTRACT_OPTIONAL_TYPE

I wonder if you'd be willing to accept this more robust implementation for the `BOOST_RANGE_EXTRACT_OPTIONAL_TYPE` macro? I've had random failures on MSVC with the current implementation is situations where I get a hard error instead of SFINAE in the defaulted template parameter. Thanks.