How does Go handle synchronization and communication between Goroutines?