Add explicit 'make' step in Dockerfile to compile the C NIF before
Elixir compilation. This ensures towerops_nif.so exists when the
Elixir code tries to load it.
The custom compiler task creates a bootstrap problem (needs to be
compiled before it can be used as a compiler), so we compile the
C NIF explicitly instead of relying on the compilers list.
- Rewrote Ping module to use system ping binary instead of raw ICMP
sockets which required CAP_NET_RAW privileges
- Added iputils-ping package to Docker images for production
- Added proper IP address validation before executing ping command
- Updated tests to account for 1 second minimum timeout of system ping
- System ping binary is setuid root and works without elevated privileges