[neo-project/neo] Feature manifest and permission system for NeoContract (#287)

I have a new idea. A contract can declare which contracts and methods it will invoke. For example:

«`json
{
«features»: {
«storage»: {
«size»: 500,
«dynamic»: true
},
«payable»: true
},
«permissions»: [
{
«hash»: «0xceab719b8baa2310f232ee0d277c061704541cfb»,
«methods»: [ «transfer», «balanceOf» ]
}
]
}
«`

This manifest restricts the contract to only invoke the contract with a hash of `0xceab719b8baa2310f232ee0d277c061704541cfb` and can only call its `transfer` and `balanceOf` methods.

It can also declare that it will call all methods of the contract:

«`json
{
«permissions»: [
{
«hash»: «0xceab719b8baa2310f232ee0d277c061704541cfb»,
«methods»: «*»
}
]
}
«`

For dynamic invocations, you can declare like this:

«`json
{
«permissions»: [
{
«hash»: «*»,
«methods»: «*»
}
]
}
«`

You can also restrict the methods to be called in dynamic invocations:

«`json
{
«permissions»: [
{
«hash»: «*»,
«methods»: [ «name», «symbol», «decimals» ]
}
]
}
«`

You can also add special records:

«`json
{
«permissions»: [
{
«hash»: «*»,
«methods»: [ «name», «symbol», «decimals» ]
},
{
«hash»: «0xceab719b8baa2310f232ee0d277c061704541cfb»,
«methods»: [ «transfer», «balanceOf» ]
}
]
}
«`

A contract can also be declared without permission:

«`json
{
«permissions»: []
}
«`

In this case, the contract can only call itself.