What are the differences between value types and reference types in Swift? When would you choose one over the other?