Derive or ignore Copy for types that can implement it

This goes through all types that previously would have inferred Copy and either derives it or allows its absence. For many types the choice is obvious, but for some it's a bit of a judgment call. The general rule I used is that if the struct transitively contains a raw pointer then it ignores copy, otherwise it derives it.