main: add address validation and unix domain socket support

```go
type listener struct {
    addr string
    proto string
}

func (l *listener) Listen() (net.Listener, error) {
    switch proto{
    case x: 
    }
}
```
personally, i think this is simpler and clean. but i would like to see other opinions.