I use a versioned S3 bucket to store state in my project, terraform also supports "locks" to avoid race conditions/parallel execution. I've set up buildkite to run `terraform plan` and then if the output looks I can approve the next step to run `terraform apply`.
Atlantis (https://github.com/runatlantis/atlantis) is also a really cool project for managing teams working on terraform projects.