Explain the difference between value types and reference types in C#, and how they impact garbage collection.