How does Go handle error handling and exception handling, and what are the best practices for error handling in Go programs?