Currently the `getnetworkinfo` returns something like: 

```
"localservices": "0000000000000449",
```

Manually parsing this consistently gives me a headache (see also https://github.com/sipa/bitcoin-seeder/pull/77).

It would be useful to parse this and show the right combination of `NODE_NETWORK`, `NODE_GETUTXO`, `NODE_BLOOM`, `NODE_WITNESS`, `NODE_NETWORK_LIMITED` and `NODE_COMPACT_FILTERS`. In addition the help text for `getnetworkinfo` could be expanded to mention the right BIP numbers for known flags.

There is some ad hoc parsing to populate e.g. `localrelay`, etc (?).  Their help text could also refer back to `NODE_GETUTXO`.

See also: https://en.bitcoin.it/wiki/Protocol_documentation#Network_address
PushSection({indent_next + "...", ""});
            }
            PushSection({indent + "}" + (outer_type != OuterType::NAMED_ARG ? "," : ""), ""});
            break;
        }
        case RPCArg::Type::ARR: {
            auto left = indent;
            left += push_name ? "\"" + arg.m_name + "\": " : "";
            left += "[";
            const auto right = outer_type == OuterType::NAMED_ARG ? "" : arg.ToDescriptionString();
            PushSection({left, right});
            for (const auto& arg_inner : arg.m_inner) {
                Push(arg_inner, current_indent + 2, OuterType::ARR);
            }
            PushSection({indent_next + "...", ""});
            PushSection({indent + "]" + (outer_type != OuterType::NAMED_ARG ? "," : ""), ""});
            break;
        }
            
        }
    }
    /**
     * Concatenate all sections with proper padding
     */
    std::string ToString() const
    {
        std::string ret;
        const size_t pad = m_max_pad + 4;
        for (const auto& s : m_sections) {
            if (s.m_right.empty()) {