TokenDrop: Unprotected initialize() function
The `TokenDrop.initialize()` function is unprotected and can be called multiple times.\\n```\\nfunction initialize(address \\_measure, address \\_asset) external {\\n    measure = IERC20Upgradeable(\\_measure);\\n    asset = IERC20Upgradeable(\\_asset);\\n\\n    // Set Factory Deployer\\n    factory = msg.sender;\\n}\\n```\\n\\nAmong other attacks, this would allow an attacker to re-initialize any `TokenDrop` with the same `asset` and a malicious `measure` token. By manipulating the balance of a user in this malicious `measure` token, the entire `asset` token balance of the `TokenDrop` contract could be drained.
Add the `initializer` modifier to the `initialize()` function and include an explicit test that every initialization function in the system can be called once and only once.
```\\nfunction initialize(address \\_measure, address \\_asset) external {\\n    measure = IERC20Upgradeable(\\_measure);\\n    asset = IERC20Upgradeable(\\_asset);\\n\\n    // Set Factory Deployer\\n    factory = msg.sender;\\n}\\n```\\n