[PoC][orders] Unified way to process payments

The PR adds three interface `MoneyInteface`, `CurrencyInterface`, `ClientInterface` and `OrderInterface` and basic implementations for all of them. 

The main idea is to establish a protocol (the `OrderInterface`) which must be supported by all payments. As soon as you reuse `OrderInterface` you dont have to worry about payment specific details. It would be really easy to change one payment extension by another.

This will work inside you favorite framework (**symfony2, zend2, laravel, yii** you name it) out of the box.
[Here's](http://sandbox.payum.forma-dev.com/payment/order_purchase/prepare) the working example. 

## Capture

```php
<?php
use Payum\Core\Model\Client;
use Payum\Core\Model\Order;
use Payum\Core\Model\Money;
use Payum\Core\Model\Currency;
use Payum\Core\Request\Capture;
use Payum\Paypal\ExpressCheckout\Nvp\PaymentFactory as PaypalExpressPaymentFactory;
use Payum\Paypal\ExpressCheckout\Nvp\Api;

$oneDollar = new Money(100, new Currency('USD'));

$client = new Client;
$client->setEmail('foo@example.com');

$order = new Order;
$order->setClient($client);
$order->setNumber(uniqid());
$order->setTotalPrice($oneDollar);

$payment = PaypalExpressPaymentFactory::create(new Api(array(
   'username'  => 'change it',
   'password'  => 'change it',
   'signature' => 'change it',
   'sandbox'   => true,
)));

if ($reply = $payment->execute(new Capture($order), true)) {
    if ($reply instanceof HttpRedirect) {
        header("Location: ".$reply->getUrl());
        die();
    }

    throw new \LogicException('Unsupported reply', null, $reply);
}
```

## Get status

```php
<?php
use Payum\Core\Request\GetHumanStatus;

$oneDollar = new Money(100, new Currency('USD'));

$order = new Order;
$order->setNumber(uniqid());
$order->setTotalPrice($oneDollar);

$payment = PaypalExpressPaymentFactory::create(new Api(array(
   'username'  => 'change it',
   'password'  => 'change it',
   'signature' => 'change it',
   'sandbox'   => true,
)));

$payment->execute($status = new GetHumanStatus($order));
 
if ($status->isCaptured()) {
   // captured!!!
} else {
    echo $status->getValue();
}
```

## Get Details 

```php
<?php
$payment->execute(new Authorize($order));

$payment->execute(new Refund($order));

$payment->execute(new Cancel($order));
```

## Customizations

There is a possibility to customize payment specific details:

```php
<?php
use Payum\Core\Model\Order;
use Payum\Core\Model\Money;
use Payum\Core\Model\Currency;
use Payum\Paypal\ExpressCheckout\Nvp\Api;

$oneDollar = new Money(100, new Currency('USD'));

$order = new Order;
$order->setNumber(uniqid());
$order->setTotalPrice($oneDollar);
$order->setDetails(
    'NOSHIPPING' = Api::NOSHIPPING_NOT_DISPLAY_ADDRESS,
    'REQCONFIRMSHIPPING' => Api::REQCONFIRMSHIPPING_NOT_REQUIRED,
    'L_PAYMENTREQUEST_0_ITEMCATEGORY0' =>   Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL,
    'L_PAYMENTREQUEST_0_AMT0' => 1,
    'L_PAYMENTREQUEST_0_QTY0' => 1,
    'L_PAYMENTREQUEST_0_NAME0' => 'The Mysterious Island. Jules Verne',
    'L_PAYMENTREQUEST_0_DESC0' => 'The Mysterious Island is a novel by Jules Verne, published in 1874.',
);

// do capture
```

* [x] Paypal ExpressCheckout
* [ ] Paypal ProCheckout
* [ ] Paypal Rest
* [x] Authorize.NET AIM
* [x] Be2Bill
* [x] Be2Bill Onsite
* [ ] Payex
* [ ] Klarna Invoice
* [ ] Klarna Checkout
* [ ] Stripe.Js
* [ ] Stripe Checkout
* [ ] Offline
* [ ] Omnipay Bridge
* [ ] JMS Payment Bridge


@aequasi partly agree with you, and I used to do as you suggest. I'd consider it as an exception from the main rule.

```php
<?php
$this->payment->execute($status = new GetHumanStatus($order));
if ($status->isCaptured()) {
}

// vs 

$status = new GetHumanStatus($order)
$this->payment->execute($status);
if ($status->isCaptured()) {
}
```