Issue:
refactor(drainer, router): KMS decrypt database password when `kms` feature is enabled

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [ ] Enhancement
- [x] Refactoring
- [ ] Dependency updates

## Description
<!-- Describe your changes in detail -->
This PR enables the use of KMS encrypted database passwords for the `router` and `drainer` crates when the `kms` feature is enabled.

### Additional Changes

- [ ] This PR modifies the database schema
- [x] This PR modifies application configuration/environment variables

I prefer being explicit that a variable expects a KMS-encryted value, so I use `kms_encrypted_password` and KMS decrypt it to obtain the password when the `kms` feature is enabled, and use the `password` config value directly whenever the `kms` feature is disabled. Let me know if it would be preferable to use the `password` config value in both scenarios.

When `kms` feature is enabled, the `ROUTER__MASTER_DATABASE__PASSWORD`, `ROUTER__REPLICA_DATABASE__PASSWORD` and `DRAINER__MASTER_DATABASE__PASSWORD` environment variables should now be replaced with `ROUTER__MASTER_DATABASE__KMS_ENCRYPTED_PASSWORD`, `ROUTER__REPLICA_DATABASE__KMS_ENCRYPTED_PASSWORD` and `DRAINER__MASTER_DATABASE__KMS_ENCRYPTED_PASSWORD` instead, while ensuring that their values are replaced with their KMS encrypted equivalents.

KMS encrypted database passwords can be obtained like so:

```shell
$ echo -n 'MyVerySecretDatabasePassword' | base64

# Use the obtained ciphertext as the value for the config variable
$ aws kms encrypt --output json --key-id my-aws-key-id --plaintext <BASE64_ENCODED_DATABASE_PASSWORD>
```

## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless its an obvious bug or documentation fix
that will have little conversation).
-->
This should add another layer of security for the database passwords.

## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->
Manually.

## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `cargo clippy`
- [x] I reviewed submitted code
- [ ] I added unit tests for my changes where possible
- [ ] I added a [CHANGELOG](/CHANGELOG.md) entry if applicable


Resolution:
<think>
PR Context:
- Title: refactor: extract kms module to `external_services` crate
- Merged: 2023-03-24T09:12:47Z
- Files changed: 15 files
- Commits: 4 commits

Implementation approach:
## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [ ] Enhancement
- [x] Refactoring
- [ ] Dependency updates

## Description
<!-- Describe your changes in detail -->
This PR extracts the `kms` module in the `router` crate to a new crate `external_services`. (Name suggestions for the new crate are welcome.)

## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to
</think>

To implement this, you'll need to modify:


**Detailed Implementation:**


**Commit 1:** refactor: extract kms module to `external_services` crate (#793)
Files to modify:


**crates/drainer/src/env.rs**
  Modify existing code

**crates/external_services/src/lib.rs**
  Add:
    - mod: pub::kms
    - mod: pub::consts
    - mod: pub::metrics

**crates/router/src/configs/settings.rs**
  Remove:
    - struct: pub::Kms

**crates/router/src/configs/validations.rs**
  Remove:
    - function: pub::validate
    - impl: impl super::settings::Kms

**crates/router/src/core/api_keys.rs**
  Modify existing code

**crates/router/src/core/payment_methods/transformers.rs**
  Modify existing code

**crates/router/src/core/payment_methods/vault.rs**
  Modify existing code

**crates/router/src/env.rs**
  Modify existing code

**crates/router/src/services.rs**
  Remove:
    - mod: pub::kms

**crates/router_env/tests/env.rs**
  Modify existing code