Implementing a pointer cast registry mechanism

This mechanism allows users to autowire types that are completely undefined.  Generally speaking, any function whose behavior might depend on whether the Autowired instance has been autowired or not will require that the type be completely defined.  This includes obvious functions, such as `Autowired::operator->`, but also less obvious functions such as `Autowired::NotifyWhenAutowired` and `Autowired::operator bool`.

As a trapdoor, the function `Autowired::get_unsafe` has been added.  This function does not require that the autowired type be registered, but inconsistent behavior will result if it's not, especially when dealing with class interfaces.