- Remove MSGPackFormatting trait
- Add Dataset struct to wrap data and labels (also for batch training)
- Refactor train function to use Dataset struct
- Divide train function into train step and validation step
- Implement Weightnable trait for layers who has trainable weights
- Add callbacks for training (early stopping, logging, etc.)
- Use multithreading for training