What is the difference between declarative and programmatic Infrastructure as Code? Why it matters and when you should use each? Best practices for writing good Infrastructure as Code when using AWS CloudFormation, AWS SAM, AWS CDK, Pulumi, Terraform, SST, Serverless Framework, etc.