Poset rule for Orphan Checking

Implements the poset rule for orphan checking. With `privileged_self`, allow the self parameter to be used even if generics contain exposed type parameters (which is required for `impl Iterator<T> for Vec<T>`)