How does garbage collection works in Go?