Explain the use of Go's error wrapping and error annotations for propagating and debugging errors in Go programs?