mgr/nfs: improve cluster info implementation and fix deployment type logic
- Show placement details and daemon roles in cluster info output
- Add deployment type field showing standalone/active-passive/active-active
- Use orchestrator.DaemonDescriptionStatus.to_str() directly
- Use placement.to_json() for placement field
- Cache get_hosts() to avoid O(n) orchestrator calls
- Optimize ingress service lookup with direct query
- Fix safe access to daemon.ports to prevent IndexError
- Use explicit None checks for port values
- Return empty dict {} for placement instead of None
- Remove unnecessary wrapper methods and comments
- Fix flake8 issues and update tests