Use collected_paths for enum and struct patterns

A bit of refactoring lets us use collected_paths for enum and struct patterns. Basically we store another element in the tuple telling the kind of reference it is, since regular variants are `var_ref` and structs use `struct_ref.`