What is the difference between Go's type constraints and type assertions for enforcing constraints and checking types in Go programs?